Camera2Client.cpp revision 603b12efa16e7afb4e6c75f6b353216c83e8e135
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>
2778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala#include <media/hardware/MetadataBufferType.h>
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <math.h>
30f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Client.h"
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingUid() {
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingUid();
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int clientPid):
5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        Client(cameraService, cameraClient,
54f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                cameraId, cameraFacing, clientPid),
553a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        mState(DISCONNECTED),
56d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId(NO_STREAM),
57d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewRequest(NULL),
58d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId(NO_STREAM),
599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCaptureRequest(NULL),
609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingStreamId(NO_STREAM),
61983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingRequest(NULL),
62983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapCount(kDefaultRecordingHeapCount)
63f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
64a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const {
703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    int callingPid = getCallingPid();
713a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if (callingPid == mClientPid) return NO_ERROR;
723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    ALOGE("%s: attempt to use a locked camera from a different process"
743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    return PERMISSION_DENIED;
763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala}
773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
80a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
819e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
91174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->setNotifyCallback(this);
92174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = buildDefaultParameters();
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
101836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        LockedParameters::Key k(mParameters);
102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
104836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        ALOGD("%s", k.mParameters.paramsFlattened.string());
105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
1086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
11061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
11161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
113a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId);
1154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    // Rewrite mClientPid to allow shutdown by CameraService
1193a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mClientPid = getCallingPid();
120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
12161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
12261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
124611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
126611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
127611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
128611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
132836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    const Parameters& p = mParameters.unsafeUnlock();
133836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append(getStateName(mState));
1357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1364ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
138836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
140836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
142836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
14311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
144836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
146836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
148836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
150836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
151836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
153836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
156836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
157836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
1587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
159836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
161836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
165836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
178836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
192836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
201836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
223836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
234836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
249836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
250836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
251836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
252836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
253836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
257836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
260836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
261836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
264836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
266836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
267836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
268836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
269836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
270836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
273836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
274836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
275836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
278836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
281836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
2843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n", mPreviewStreamId);
2853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n", mCaptureStreamId);
286836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n", mRecordingStreamId);
2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current requests:\n");
2893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mPreviewRequest != NULL) {
2903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request:\n");
2913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
292428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        dump_indented_camera_metadata(mPreviewRequest, fd, 2, 6);
2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request: undefined\n");
2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mCaptureRequest != NULL) {
2993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request:\n";
3003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
301428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        dump_indented_camera_metadata(mCaptureRequest, fd, 2, 6);
3023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
3033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request: undefined\n";
3043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
307428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    if (mRecordingRequest != NULL) {
308428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request:\n";
309428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
310428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        dump_indented_camera_metadata(mRecordingRequest, fd, 2, 6);
311428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    } else {
312428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request: undefined\n";
313428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
314428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    }
315428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
3163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
317611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
3187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
3203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
3213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
3223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
3233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
327611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
32861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
32961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3304ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) {
3314ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
3324ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    switch(state) {
3333a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        CASE_ENUM_TO_CHAR(DISCONNECTED)
3344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
3354ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
3364ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
3374ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
3384ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
3394ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
3404ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        default:
3414ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return "Unknown state!";
3424ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            break;
3434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
3444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR
3454ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala}
3464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
34761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
34861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
350a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3519e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
352ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
3533a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
3543a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
355ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
356f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
357f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
35836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
3596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
360d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mDevice->waitUntilDrained();
361d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
362d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
364d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId = NO_STREAM;
365d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
366d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
367d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
368d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mDevice->deleteStream(mCaptureStreamId);
369d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId = NO_STREAM;
3706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
371f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
372898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
373898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mDevice->deleteStream(mRecordingStreamId);
374898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mRecordingStreamId = NO_STREAM;
375898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    }
376898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
3773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
3783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mState = DISCONNECTED;
3793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
38061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
38261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
384a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3859e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
386ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
387ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
3889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
3899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
3909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
3919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
3929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
3939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
3949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
3969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = client;
3979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
39961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
40061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
40161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
402a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4039e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
404ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
407ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
42061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
42161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
42261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
423a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4249e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
425ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
428ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Check for uninterruptable conditions
4309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
4329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
4349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
44061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
444a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4459e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
446ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4473a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
449ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
4536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
45736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder,window);
45861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
45961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
4616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
462a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4639e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
464ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
467ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
4716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
4726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
4736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
47436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
4756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
4766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
47736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
478be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
479a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
4839e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
4849e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
4866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    switch (mState) {
4893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        case DISCONNECTED:
4909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
4919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STILL_CAPTURE:
4929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
4939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
4949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
4959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
4969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
4979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
4989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
4999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
5019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Optimize this so that we don't wait for old stream to drain
5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // before spinning up new stream
5049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mDevice->setStreamingRequest(NULL);
5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mState = WAITING_FOR_PREVIEW_WINDOW;
5069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
509d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
510be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->waitUntilDrained();
511be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
512be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
514be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
5176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
5206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        mPreviewStreamId = NO_STREAM;
5236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
525bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
526be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mPreviewWindow = window;
527bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
5286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
52936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return startPreviewL();
5306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
53361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
53461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
53561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
536a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
537ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5383a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
54061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
54161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
54261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
543a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5449e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
545ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5473a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
54836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return startPreviewL();
549d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
550ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
55136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::startPreviewL() {
552d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5544ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    if (mState >= PREVIEW) {
5554ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
5564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                __FUNCTION__, getStateName(mState));
5574ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
5584ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
5596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
560be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewWindow == 0) {
5616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = WAITING_FOR_PREVIEW_WINDOW;
5626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
5636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
564be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mState = STOPPED;
5656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
566836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
5679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
568836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updatePreviewStream(k.mParameters);
569be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
570be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
571be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
572be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
5736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
575be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewRequest == NULL) {
576836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        res = updatePreviewRequest(k.mParameters);
577be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
578be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
579be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
580be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
581be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
584be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mPreviewRequest,
585be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
586be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mPreviewStreamId, 1);
5876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
5886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
5896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
590be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
591be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
592be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = sort_camera_metadata(mPreviewRequest);
593be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
594be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
595be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
5966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
5976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
6006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
601bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
602bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
6036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = PREVIEW;
6076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
60961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
61061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
61161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
612a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6139e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
614ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6163a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
61736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
618ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
619ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
62036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
621ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
622d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
6233a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        case DISCONNECTED:
624d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
625d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
626d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
627d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
628d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
629d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
630d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
631d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
632d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
633d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
634d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // TODO: Handle record stop here
635d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
636d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mDevice->setStreamingRequest(NULL);
6372267106c98f461b730c772a913da946c391a178cEino-Ville Talvala            mDevice->waitUntilDrained();
638d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
639d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = STOPPED;
640d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
641d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
642d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
643d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    mState);
644d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
64561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
64661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
64761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
648a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
649ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6513a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
6523a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
6536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mState == PREVIEW;
65461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
65561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
65661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
657a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
658ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6603a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6613a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
66278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    switch (mState) {
66378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        case RECORD:
66478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        case VIDEO_SNAPSHOT:
66578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
66678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
66778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
66878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
66978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
67078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
67178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
672836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
67378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
674836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.storeMetadataInBuffers = enabled;
67578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
67678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
67761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
67861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
67961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
680a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6819e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
682ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
6843a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6853a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
6869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    switch (mState) {
6879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
68836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            res = startPreviewL();
6899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
6909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
6919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
6929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
6939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
6949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
6959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
6969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to call this when recording is already on
6979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return OK;
6989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
6999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
7009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
7019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
7029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
7039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
7049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
705836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
7069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
707836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (!k.mParameters.storeMetadataInBuffers) {
70878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
70978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
71078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
71178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
71278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
71378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
714836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateRecordingStream(k.mParameters);
7159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
7179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingRequest == NULL) {
722836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        res = updateRecordingRequest(k.mParameters);
7239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
7249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
7259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
7269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
7279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
7289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId };
7319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = updateEntry(mRecordingRequest,
7329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
7339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            outputStreams, 2);
7349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
7369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = sort_camera_metadata(mRecordingRequest);
7409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
7429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mRecordingRequest);
7479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set recording request to start "
7499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "recording: %s (%d)", __FUNCTION__, mCameraId,
7509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
7519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mState = RECORD;
7549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
75661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
75761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
75861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
759a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7609e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
761ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
7633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
7643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    switch (mState) {
7669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
7679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
7689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
7709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
7719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STILL_CAPTURE:
7729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
7739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
7749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
7759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
7769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
7779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
7789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Back to preview. Since record can only be reached through preview,
7809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // all preview stream setup should be up to date.
7819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
7829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to switch back to preview request: "
7849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
7859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
7869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Should recording heap be freed? Can't do it yet since requests
7899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // could still be in flight.
7909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mState = PREVIEW;
79261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
79361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
79461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
795a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
796ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7978da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
7983a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
7993a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
8008da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
8018da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
8028da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
8038da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
8048da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
8058da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
8069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return (mState == RECORD || mState == VIDEO_SNAPSHOT);
80761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
80861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
80961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
810a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
811ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8123a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
8149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Make sure this is for the current heap
8159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ssize_t offset;
8169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t size;
8179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
8189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
8199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
8209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "(got %x, expected %x)", __FUNCTION__, mCameraId,
8219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
8229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
8239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
82478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint8_t *data = (uint8_t*)heap->getBase() + offset;
82578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint32_t type = *(uint32_t*)data;
82678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (type != kMetadataBufferTypeGrallocSource) {
82778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
82878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
82978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
83078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
83178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    buffer_handle_t imgBuffer = *(buffer_handle_t*)(data + 4);
83278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
833803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala            imgBuffer);
83478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    res = mRecordingConsumer->freeBuffer(imgBuffer);
83578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (res != OK) {
83678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
83778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "%s (%d)",
83878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                __FUNCTION__, mCameraId, imgBuffer, strerror(-res), res);
83978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
84078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
84178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
8429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mRecordingHeapFree++;
84361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
84461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
84561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
846a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
847ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
8503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
851174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
852174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
853174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        LockedParameters::Key k(mParameters);
854174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        k.mParameters.currentAfTriggerId = ++k.mParameters.afTriggerCounter;
855174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        triggerId = k.mParameters.currentAfTriggerId;
856174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
857174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
858174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
859174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
8606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
86161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
86261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
86361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
864a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
865ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8673a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
8683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
869174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
870174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
871174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        LockedParameters::Key k(mParameters);
872174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        triggerId = ++k.mParameters.afTriggerCounter;
873174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
874174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
875174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
876174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
8776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
87861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
87961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
88061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
881a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
882ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
883d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
8843a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
885d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
886d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
8873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        case DISCONNECTED:
888d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
889d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
890d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
891d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
892d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
893d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
894d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
895d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
896d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
897d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
898d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case VIDEO_SNAPSHOT:
899d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
900d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
901d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
902d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
903d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
904836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
905d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
906836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateCaptureStream(k.mParameters);
9074ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    if (res != OK) {
908be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
909be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
9104ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return res;
9114ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
912d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
913d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureRequest == NULL) {
914836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        res = updateCaptureRequest(k.mParameters);
9154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        if (res != OK) {
916be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create still image capture request: "
917be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
9184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return res;
9194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
920d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
921d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
922d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_entry_t outputStreams;
9239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mState == PREVIEW) {
9249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
9259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS,
9269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &streamIds, 2);
9279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    } else if (mState == RECORD) {
9289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId,
9299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                 mCaptureStreamId };
9309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS,
9319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &streamIds, 3);
9329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
9339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
934d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
935d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
936d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
937d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
938d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
939d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
940be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = sort_camera_metadata(mCaptureRequest);
941be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
942be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)",
943be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
944be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
945be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
946d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
947d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest);
948d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (captureCopy == NULL) {
949d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
950d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
951d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return NO_MEMORY;
952d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
953d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
954d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mState == PREVIEW) {
955d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->setStreamingRequest(NULL);
956d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
957d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
958d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)",
959d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
960d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
961d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
962d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
9639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
964d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = mDevice->capture(captureCopy);
965d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
966d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
967d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
968d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
969d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
970d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
971d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
972d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
973d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
974d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = STILL_CAPTURE;
975d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
976d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
977d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = VIDEO_SNAPSHOT;
978d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
979d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
980d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state for still capture!",
981d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
982d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
983d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
984d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
985d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
98661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
98761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
98861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
989a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9909e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
991ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
9933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    LockedParameters::Key k(mParameters);
9966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    CameraParameters newParams(params);
9986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only
10006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // parameters such as supported preview sizes, etc. Should probably
10016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // produce an error if they're changed.
10026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Extract and verify new parameters */
10046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t i;
10066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_SIZE
10086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewWidth, previewHeight;
10096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPreviewSize(&previewWidth, &previewHeight);
10106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
1011836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (previewWidth != k.mParameters.previewWidth ||
1012836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            previewHeight != k.mParameters.previewHeight) {
10136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState >= PREVIEW) {
10146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
10159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "is active! (Currently %d x %d, requested %d x %d",
10169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__,
1017836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewWidth, k.mParameters.previewHeight,
10189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    previewWidth, previewHeight);
10196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePreviewSizes =
10226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
10236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
10246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePreviewSizes.data.i32[i] == previewWidth &&
10256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePreviewSizes.data.i32[i+1] == previewHeight) break;
10266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewSizes.count) {
10286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
10296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, previewWidth, previewHeight);
10306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FPS_RANGE
103511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int previewFpsRange[2];
103611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int previewFps = 0;
10376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool fpsRangeChanged = false;
103811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]);
1039836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (previewFpsRange[0] != k.mParameters.previewFpsRange[0] ||
1040836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            previewFpsRange[1] != k.mParameters.previewFpsRange[1]) {
10416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        fpsRangeChanged = true;
10426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePreviewFpsRanges =
10436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
10446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
10456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
104611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    previewFpsRange[0]) &&
10476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
104811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    previewFpsRange[1]) ) {
10496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
10506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
10516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
10536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
105411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                __FUNCTION__, previewFpsRange[0], previewFpsRange[1]);
10556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
105711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        previewFps = previewFpsRange[0];
10586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FORMAT
10616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
1062836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (previewFormat != k.mParameters.previewFormat) {
10636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState >= PREVIEW) {
10646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
10656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "is active!", __FUNCTION__);
10666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableFormats =
10696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
10706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableFormats.count; i++) {
10716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableFormats.data.i32[i] == previewFormat) break;
10726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableFormats.count) {
10746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview format %s (0x%x) is not supported",
10756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
10766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FRAME_RATE
10816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Deprecated, only use if the preview fps range is unchanged this time.
10826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // The single-value FPS is the same as the minimum of the range.
10836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (!fpsRangeChanged) {
10846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        previewFps = newParams.getPreviewFrameRate();
1085836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (previewFps != k.mParameters.previewFps) {
10866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t availableFrameRates =
10876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
10886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
10896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (availableFrameRates.data.i32[i] == previewFps) break;
10906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
10916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableFrameRates.count) {
10926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
10936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__, previewFps);
10946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
10956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
109611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[0] = availableFrameRates.data.i32[i];
109711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[1] = availableFrameRates.data.i32[i+1];
10986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PICTURE_SIZE
11026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int pictureWidth, pictureHeight;
11036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPictureSize(&pictureWidth, &pictureHeight);
1104836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (pictureWidth == k.mParameters.pictureWidth ||
1105836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            pictureHeight == k.mParameters.pictureHeight) {
11066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePictureSizes =
11076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
11086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePictureSizes.count; i+=2) {
11096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePictureSizes.data.i32[i] == pictureWidth &&
11106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePictureSizes.data.i32[i+1] == pictureHeight) break;
11116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePictureSizes.count) {
11136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
11146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, pictureWidth, pictureHeight);
11156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
112011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int jpegThumbSize[2];
112111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    jpegThumbSize[0] =
11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
112311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    jpegThumbSize[1] =
11246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
1125836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (jpegThumbSize[0] != k.mParameters.jpegThumbSize[0] ||
1126836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            jpegThumbSize[1] != k.mParameters.jpegThumbSize[1]) {
11276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableJpegThumbSizes =
11286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
11296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
113011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] &&
113111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) {
11326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
11336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
11346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
11366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
113711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]);
11386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
11436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegThumbQuality =
11446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
11456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
11466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
11476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegThumbQuality);
11486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
11496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_QUALITY
11526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegQuality =
11536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
11546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegQuality < 0 || jpegQuality > 100) {
11556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
11566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegQuality);
11576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
11586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ROTATION
11616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegRotation =
11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
11636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegRotation != 0 &&
11646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 90 &&
11656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 180 &&
11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 270) {
11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegRotation);
11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // GPS
11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool gpsEnabled = false;
117411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    double gpsCoordinates[3] = {0,0,0};
11756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int64_t gpsTimestamp = 0;
11766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 gpsProcessingMethod;
11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    const char *gpsLatStr =
11786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
11796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (gpsLatStr != NULL) {
11806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsLongStr =
11816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
11826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsAltitudeStr =
11836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
11846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsTimeStr =
11856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
11866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsProcMethodStr =
11876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
11886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (gpsLongStr == NULL ||
11896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsAltitudeStr == NULL ||
11906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsTimeStr == NULL ||
11916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsProcMethodStr == NULL) {
11926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
11936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *endPtr;
11976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
119811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
11996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
12006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
12016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
120411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
12056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
12066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
12076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
121011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
12116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
12126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
12136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    gpsAltitudeStr);
12146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
12176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
12186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
12196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
12206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsProcessingMethod = gpsProcMethodStr;
12236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsEnabled = true;
12256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // WHITE_BALANCE
12286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int wbMode = wbModeStringToEnum(
12296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
1230836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (wbMode != k.mParameters.wbMode) {
12316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableWbModes =
12326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
12336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
12346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (wbMode == availableWbModes.data.u8[i]) break;
12356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableWbModes.count) {
12376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
12386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
12396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
12406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EFFECT
12456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int effectMode = effectModeStringToEnum(
12466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
1247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (effectMode != k.mParameters.effectMode) {
12486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableEffectModes =
12496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
12506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
12516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (effectMode == availableEffectModes.data.u8[i]) break;
12526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableEffectModes.count) {
12546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
12556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
12566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
12576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ANTIBANDING
12626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int antibandingMode = abModeStringToEnum(
12636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
1264836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (antibandingMode != k.mParameters.antibandingMode) {
12656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableAbModes =
12666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
12676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
12686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (antibandingMode == availableAbModes.data.u8[i]) break;
12696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableAbModes.count) {
12716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
12726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
12736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
12746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // SCENE_MODE
12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int sceneMode = sceneModeStringToEnum(
12806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
1281836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (sceneMode != k.mParameters.sceneMode) {
12826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableSceneModes =
12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
12846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
12856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (sceneMode == availableSceneModes.data.u8[i]) break;
12866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableSceneModes.count) {
12886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
12896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
12906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
12916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FLASH_MODE
12966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::flashMode_t flashMode = flashModeStringToEnum(
12976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FLASH_MODE) );
1298836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (flashMode != k.mParameters.flashMode) {
12996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t flashAvailable =
13006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
13016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (!flashAvailable.data.u8[0] &&
13026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                flashMode != Parameters::FLASH_MODE_OFF) {
13036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
13046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
13056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
13066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
13076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
13086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t availableAeModes =
13096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
13106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
13116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (flashMode == availableAeModes.data.u8[i]) break;
13126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
13136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableAeModes.count) {
13146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
13156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
13166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
13176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
13186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
13196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == -1) {
13206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
13216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
13226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
13236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
13246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_MODE
13286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::focusMode_t focusMode = focusModeStringToEnum(
13296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FOCUS_MODE));
1330836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (focusMode != k.mParameters.focusMode) {
13316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (focusMode != Parameters::FOCUS_MODE_FIXED) {
13326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t minFocusDistance =
13336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
13346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (minFocusDistance.data.f[0] == 0) {
13356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
13366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        "fixed focus lens",
13376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
13386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
13396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
13406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
13416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                camera_metadata_entry_t availableFocusModes =
13426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
13436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
13446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    if (focusMode == availableFocusModes.data.u8[i]) break;
13456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
13466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (i == availableFocusModes.count) {
13476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
13486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            __FUNCTION__,
13496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
13506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    return BAD_VALUE;
13516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
13526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
13536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_AREAS
13576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> focusingAreas;
13586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
13596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &focusingAreas);
13606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t max3aRegions =
13616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
13626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
13636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
13646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
13656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
13666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
13676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EXPOSURE_COMPENSATION
13706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int exposureCompensation =
13716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
13726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
13736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
13746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
13756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            exposureCompensation > exposureCompensationRange.data.i32[1]) {
13766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
13776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, exposureCompensation);
13786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
13796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
13826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoExposureLock = boolFromString(
13836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
13846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
13866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoWhiteBalanceLock = boolFromString(
13876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
13886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // METERING_AREAS
13906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> meteringAreas;
13916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
13926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &meteringAreas);
13936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
13946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
13956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
13966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__,
13976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
13986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
13996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ZOOM
14026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
14036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
14046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
14056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, zoom);
14066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
14076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_SIZE
14106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int videoWidth, videoHeight;
14116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getVideoSize(&videoWidth, &videoHeight);
1412836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (videoWidth != k.mParameters.videoWidth ||
1413836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            videoHeight != k.mParameters.videoHeight) {
14146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState == RECORD) {
14156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Video size cannot be updated when recording is active!",
14166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
14176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
14186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableVideoSizes =
14206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
14216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
14226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableVideoSizes.data.i32[i] == videoWidth &&
14236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availableVideoSizes.data.i32[i+1] == videoHeight)  break;
14246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableVideoSizes.count) {
14266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested video size %d x %d is not supported",
14276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, videoWidth, videoHeight);
14286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
14296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // RECORDING_HINT (always supported)
14336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool recordingHint = boolFromString(
14346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
14356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_STABILIZATION
14376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool videoStabilization = boolFromString(
14386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
14396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
14406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
14416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (videoStabilization && availableVideoStabilizationModes.count == 1) {
14426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
14436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Update internal parameters */
14469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1447836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewWidth = previewWidth;
1448836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewHeight = previewHeight;
1449836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[0] = previewFpsRange[0];
1450836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[1] = previewFpsRange[1];
1451836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFps = previewFps;
1452836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFormat = previewFormat;
1453836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1454836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureWidth = pictureWidth;
1455836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureHeight = pictureHeight;
1456836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1457836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[0] = jpegThumbSize[0];
1458836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[1] = jpegThumbSize[1];
1459836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegQuality = jpegQuality;
1460836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbQuality = jpegThumbQuality;
1461836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1462836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsEnabled = gpsEnabled;
1463836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsCoordinates[0] = gpsCoordinates[0];
1464836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsCoordinates[1] = gpsCoordinates[1];
1465836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsCoordinates[2] = gpsCoordinates[2];
1466836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsTimestamp = gpsTimestamp;
1467836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsProcessingMethod = gpsProcessingMethod;
1468836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1469836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.wbMode = wbMode;
1470836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.effectMode = effectMode;
1471836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.antibandingMode = antibandingMode;
1472836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.sceneMode = sceneMode;
1473836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1474836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.flashMode = flashMode;
1475174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (focusMode != k.mParameters.focusMode) {
1476174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        k.mParameters.currentAfTriggerId = -1;
1477174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1478836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusMode = focusMode;
1479836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1480836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusingAreas = focusingAreas;
1481836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.exposureCompensation = exposureCompensation;
1482836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoExposureLock = autoExposureLock;
1483836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
1484836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.meteringAreas = meteringAreas;
1485836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.zoom = zoom;
1486836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1487836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoWidth = videoWidth;
1488836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoHeight = videoHeight;
1489836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1490836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.recordingHint = recordingHint;
1491836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoStabilization = videoStabilization;
1492836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1493836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updatePreviewRequest(k.mParameters);
1494be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1495be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1496be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1497be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1498be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1499836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateCaptureRequest(k.mParameters);
1500be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1501be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)",
1502be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1503be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1504be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1505be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1506836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateRecordingRequest(k.mParameters);
15079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
15089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
15099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
15109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
15119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
15129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mState == PREVIEW) {
1514be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->setStreamingRequest(mPreviewRequest);
1515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1516be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
15209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    } else if (mState == RECORD || mState == VIDEO_SNAPSHOT) {
15219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->setStreamingRequest(mRecordingRequest);
15229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
15239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
15249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
15259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
15269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1527be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
15286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
1529836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.paramsFlattened = params;
15309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
153261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1533f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
153461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1535a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1536ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
15373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1538ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1539836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::ReadKey k(mParameters);
1540ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
15413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
1542836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    return k.mParameters.paramsFlattened;
154361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
154461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
154561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1546a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1547ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
15483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
15493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1550c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1551c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1552c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1553c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
155436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
155536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
155636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
155736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
155836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
155936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
156036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
156136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
156236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
156336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
156436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
156536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
156636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
156736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION:
156836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopFaceDetectionL();
156936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
157036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
157136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
157236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
157336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
157436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
157536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
157636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
157736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1578c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
157936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
158036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
158136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
158236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
158336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
158436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
158536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
158636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
158736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
158836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
158936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
159036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
159136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
159236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
159336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    LockedParameters::Key k(mParameters);
159436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    int transform = degToTransform(degrees,
159536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
159636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
159736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
159836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
159936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
160036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
160136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform != k.mParameters.previewTransform &&
160236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mPreviewStreamId != NO_STREAM) {
160336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mDevice->setStreamTransform(mPreviewStreamId, transform);
160436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
160536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    k.mParameters.previewTransform = transform;
160636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
160736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
160836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
160936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
161036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    LockedParameters::Key k(mParameters);
161136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
161236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        k.mParameters.playShutterSound = true;
1613c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
161436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1615983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
161636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
161736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
161836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
161936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
162036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
162136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
162236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
162336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
162436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
162536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
162636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1627983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
162836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1629983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
163036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    k.mParameters.playShutterSound = false;
163136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
163236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1633983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
163436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
163536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
163636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
163736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
163836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
163936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartFaceDetectionL(int type) {
164036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
164136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
164236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
164336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
164436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL() {
164536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
164636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
164736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
164836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
164936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
1650174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    LockedParameters::Key k(mParameters);
1651174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    k.mParameters.enableFocusMoveMessages = enable;
1652174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
165336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
165436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
165536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
165636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
165736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
165836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (mState != DISCONNECTED) {
1659983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
166036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
166136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
166236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
166336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
166436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
166536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
16668da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
166736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
166836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
166936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1670c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1671c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
167236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // 32 is the current upper limit on the video buffer count for BufferQueue
167336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (count > 32) {
167436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
167536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, count);
167636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
167736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
167836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
167936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Need to reallocate memory for heap
168036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (mRecordingHeapCount != count) {
168136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if  (mRecordingHeap != 0) {
168236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap.clear();
168336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap = NULL;
168436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        }
168536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mRecordingHeapCount = count;
168636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1687c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
16886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
168961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
169061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
16913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
16923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1693160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1694160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1695160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1696160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1697160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1698160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1699160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            frameNumber, timestamp);
1700160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1701160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1702160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1703160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1704160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1705174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1706174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1707174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1708174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1709174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1710174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
1711174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        LockedParameters::Key k(mParameters);
1712174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        switch (k.mParameters.focusMode) {
1713174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1714174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1715174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1716174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1717174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
1718174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (triggerId != k.mParameters.currentAfTriggerId) break;
1719174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1720174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1721174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1722174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1723174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1724174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1725174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        k.mParameters.currentAfTriggerId = -1;
1726174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1727174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1728174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1729174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1730174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1731174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1732174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1733174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1734174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1735174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1736174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1737174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1738174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1739174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1740174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1741174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1742174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1743174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1744174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1745174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1746174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1747174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1748174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1749174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1750174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1751174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
1752174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        if (triggerId != k.mParameters.currentAfTriggerId) break;
1753174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1754174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
1755174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        if (k.mParameters.enableFocusMoveMessages &&
1756174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                k.mParameters.afInMotion) {
1757174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1758174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1759174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        k.mParameters.currentAfTriggerId = -1;
1760174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1761174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1762174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1763174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1764174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
1765174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        if (k.mParameters.enableFocusMoveMessages &&
1766174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                k.mParameters.afInMotion) {
1767174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1768174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1769174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1770174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1771174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1772174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1773174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1774174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1775174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
1776174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        if (k.mParameters.enableFocusMoveMessages) {
1777174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1778174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1779174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1780174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1781174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                k.mParameters.afInMotion = afInMotion;
1782174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1783174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1784174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1785174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1786174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1787174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1788174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d (ID %d) in focus mode %d",
1789174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                          __FUNCTION__, newState, triggerId, k.mParameters.focusMode);
1790174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1791174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1792174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1793174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
1794174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
1795174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                afInMotion ? 1 : 0, 0);
1796174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1797603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
1798603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala        mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, success ? 1 : 0, 0);
1799603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1800160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1801160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1802160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1803160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1804160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1805160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1806160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1807160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1808160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1809160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1810160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1811160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1812d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() {
1813d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
1814d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
1815d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    sp<ICameraClient> currentClient;
18169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId);
18179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1818d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    CpuConsumer::LockedBuffer imgBuffer;
1819d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    {
1820d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        Mutex::Autolock icl(mICameraLock);
1821d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1822d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Signal errors here upstream
1823d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) {
1824d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1825d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1826d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1827d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1828d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1829d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1830d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1831d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1832d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1833d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1834d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1835d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1836d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1837d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for still image: "
1838d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
1839d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    imgBuffer.format,
1840d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    HAL_PIXEL_FORMAT_BLOB);
1841d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
1842d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1843d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1844d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1845d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Optimize this to avoid memcopy
18469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        void* captureMemory = mCaptureHeap->mHeap->getBase();
18479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size = mCaptureHeap->mHeap->getSize();
1848d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        memcpy(captureMemory, imgBuffer.data, size);
1849d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1850d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->unlockBuffer(imgBuffer);
1851d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1852d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        currentClient = mCameraClient;
1853d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        switch (mState) {
1854d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case STILL_CAPTURE:
1855d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mState = STOPPED;
1856d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case VIDEO_SNAPSHOT:
1858d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mState = RECORD;
1859d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1860d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            default:
1861d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
1862d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        mCameraId, mState);
1863d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1864d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1865d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1866d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Call outside mICameraLock to allow re-entrancy from notification
1867d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (currentClient != 0) {
1868d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
18699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCaptureHeap->mBuffers[0], NULL);
18709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
18719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
18729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
18739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() {
18749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
18759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
18769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<ICameraClient> currentClient;
18779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t heapIdx = 0;
18789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    nsecs_t timestamp;
18799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    {
18809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        Mutex::Autolock icl(mICameraLock);
18819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // TODO: Signal errors here upstream
1882898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        bool discardData = false;
18839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (mState != RECORD && mState != VIDEO_SNAPSHOT) {
1884898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1885898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala                    "recording done",
18869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
1887898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala            discardData = true;
18889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
18899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
189078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        buffer_handle_t imgBuffer;
189178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        res = mRecordingConsumer->getNextBuffer(&imgBuffer, &timestamp);
18929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
18939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
18949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
18959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
18969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
18979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1898898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        if (discardData) {
189978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            mRecordingConsumer->freeBuffer(imgBuffer);
19009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
19019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1902898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
190378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        if (mRecordingHeap == 0) {
190478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            const size_t bufferSize = 4 + sizeof(buffer_handle_t);
19059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
19069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "size %d bytes", __FUNCTION__, mCameraId,
1907983cf231ab2d176a14595cdae46ff1b0c239af47James Dong                    mRecordingHeapCount, bufferSize);
19089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap != 0) {
19099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGV("%s: Camera %d: Previous heap has size %d "
19109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "(new will be %d) bytes", __FUNCTION__, mCameraId,
19119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        mRecordingHeap->mHeap->getSize(),
1912983cf231ab2d176a14595cdae46ff1b0c239af47James Dong                        bufferSize * mRecordingHeapCount);
19139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
19149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Need to allocate memory for heap
19159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeap.clear();
19169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1917983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
19189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "Camera2Client::RecordingHeap");
19199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap->mHeap->getSize() == 0) {
19209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
19219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        __FUNCTION__, mCameraId);
192278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mRecordingConsumer->freeBuffer(imgBuffer);
19239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
19249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
19259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapHead = 0;
1926983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeapFree = mRecordingHeapCount;
19279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
19289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
19299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if ( mRecordingHeapFree == 0) {
19309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
19319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
193278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            mRecordingConsumer->freeBuffer(imgBuffer);
19339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
19349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
19359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        heapIdx = mRecordingHeapHead;
1936983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
19379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapFree--;
19389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
19399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGV("%s: Camera %d: Timestamp %lld",
19409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, timestamp);
19419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
19429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ssize_t offset;
19439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size;
19449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        sp<IMemoryHeap> heap =
19459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
19469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        &size);
19479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
194878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
194978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint32_t type = kMetadataBufferTypeGrallocSource;
195078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        memcpy(data, &type, 4);
195178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        memcpy(data + 4, &imgBuffer, sizeof(buffer_handle_t));
195278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
1953803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala                __FUNCTION__, mCameraId, imgBuffer);
19549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        currentClient = mCameraClient;
19559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
19569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Call outside mICameraLock to allow re-entrancy from notification
19579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (currentClient != 0) {
19589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        currentClient->dataCallbackTimestamp(timestamp,
19599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                CAMERA_MSG_VIDEO_FRAME,
19609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]);
1961d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1962d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1963d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
19643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
19653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        size_t minCount, size_t maxCount) {
19663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    status_t res;
19673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t entry;
19683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
19693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            tag,
19703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            &entry);
19713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
19723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
19733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
19743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
19753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
19763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
19783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, strerror(-res), res);
19793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
19803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
19813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else if (CC_UNLIKELY(
19823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
19833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
19843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
19853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
19863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
19873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
19883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
19893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
19903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
19913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
19923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
19933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
19943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return entry;
19963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
19973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
19993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2000f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2001f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
2002a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2003836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
2004ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
2005f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
20063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    CameraParameters params;
2007f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
20083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableProcessedSizes =
20093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
20103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
2011f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2012f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
2013836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewWidth = availableProcessedSizes.data.i32[0];
2014836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewHeight = availableProcessedSizes.data.i32[1];
2015836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoWidth = k.mParameters.previewWidth;
2016836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoHeight = k.mParameters.previewHeight;
20173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2018836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.setPreviewSize(k.mParameters.previewWidth, k.mParameters.previewHeight);
2019836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.setVideoSize(k.mParameters.videoWidth, k.mParameters.videoHeight);
20203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
20213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%dx%d",
2022836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewWidth, k.mParameters.previewHeight));
2023f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2024f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
2025f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
2026f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
2027f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
2028f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
2029f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
2030f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
20313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
2032f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
20333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
2034f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
2035f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2036f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
20373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFpsRanges =
20383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
20393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
2040f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2041836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0];
2042836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1];
2043f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
20443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
20453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%d,%d",
2046836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewFpsRange[0],
2047836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewFpsRange[1]));
2048f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2049f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2050f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
2051f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
2052f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
2053f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
2054f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
2055f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
2056f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
20573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
2058f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
2059f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2060f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2061836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
20623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
2063836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            formatEnumToString(k.mParameters.previewFormat)); // NV21
20643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2065836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewTransform = degToTransform(0,
2066c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
2067c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
20683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFormats =
20693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
2070f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2071f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2072f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
2073f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
2074f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
2075f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
2076f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2077f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
2078f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
2079bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
2080bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
2081f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2082f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
2083bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
2084bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
2085f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2086f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
2087bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
2088bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
2089f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2090f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
2091bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
2092bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
2093f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2094f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
2095bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
2096bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
2097f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
209811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            case HAL_PIXEL_FORMAT_RGBA_8888:
209911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                supportedPreviewFormats +=
210011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGBA8888;
210111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                break;
210211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
2103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
210411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            case HAL_PIXEL_FORMAT_BLOB:
2105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
2106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
210711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala
2108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
2109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
2110f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
2111f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
2112f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2113f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
21153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
2116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
2117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2118f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2119f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
2120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
2121f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
21223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
2123836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.previewFpsRange[0]);
2124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
2127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
2128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
2129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
2130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
2131f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
21323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
2133f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
2134f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2135f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
21363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegSizes =
21373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
21383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
2139f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
2141836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureWidth = availableJpegSizes.data.i32[0];
2142836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureHeight = availableJpegSizes.data.i32[1];
2143f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2144836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.setPictureSize(k.mParameters.pictureWidth,
2145836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.pictureHeight);
2146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2147f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2148f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
2149f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
2150f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
2151f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
2152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
2153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
2154f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
21553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
2156f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
2157f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2158f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
21593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
21603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
21613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
2162f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
21633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegThumbnailSizes =
21643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
21653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
2166f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2167f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
2168836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0];
2169836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1];
2170f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
21713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
2172836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegThumbSize[0]);
21733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
2174836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegThumbSize[1]);
2175f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2176f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2177f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
2178f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
2179f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
2180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
2181f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
2182f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
2183f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
21843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
2185f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
2186f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2187f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbQuality = 90;
21893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
2190836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegThumbQuality);
2191836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegQuality = 90;
21923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
2193836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegQuality);
2194836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegRotation = 0;
21953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
2196836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegRotation);
21973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2198836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsEnabled = false;
2199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsProcessingMethod = "unknown";
22003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
22013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
22033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
22043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
22053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
22063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableWhiteBalanceModes =
22073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
2208f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2209f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
2210f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
2211f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
2212f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
2213f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2214f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
2215f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
2216bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2217bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
2218f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2219f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
2220bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2221bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
2222f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2223f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
2224bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2225bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
2226f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2227f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
2228bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2229bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
2230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
2232bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2233bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
2234f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2235f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
2236bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2237bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
2238f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2239f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
2240bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2241bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
2242f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2243f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
2244bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2245bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
2246f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2247f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
2248f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
2249f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
2250f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2251f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
2252f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
2253f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
2254f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
2255f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
2256f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2257f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2258f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
22593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
2260f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
2261f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2262f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2263836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
22643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
22653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
22663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
22673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableEffects =
22683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
22693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
2270f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2271f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
2272f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
2273f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
2274f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
2275f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2276f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
2277f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
2278bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2279bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NONE;
2280f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2281f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
2282bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2283bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_MONO;
2284bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    break;
2285f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
2286bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2287bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
2288f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2289f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
2290bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2291bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
2292f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2293f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
2294bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2295bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
2296f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2297f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
2298bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2299bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
2300f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2301f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
2302bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2303bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
2304f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2305f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
2306bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2307bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
2308f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2309f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
2310bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2311bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
2312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2313f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2314f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
2315f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
2316f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2317f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2318f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2319f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
23203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
2321f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2323836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
23243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
23253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
23263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
23273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAntibandingModes =
23283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
23293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
2330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2331f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
2332f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
2333f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
2334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
2335f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
2337f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
2338bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2339bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
2340f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
2342bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2343bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
2344f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2345f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
2346bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2347bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
2348f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2349f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
2350bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2351bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
2352f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2353f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
2355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
2356f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
2357f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2358f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2359f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
23613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
2362f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
2363f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2364f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2365836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.sceneMode = ANDROID_CONTROL_OFF;
23663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
23673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
23683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
23693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableSceneModes =
23703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
23713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
2372f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2373bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
2374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
2375f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
2376f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
2377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
2378f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2379f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
2380f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
2382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
2384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
2385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2386f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2387f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
2388bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2389bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
2390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
2392bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2393bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
2394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2395f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
2396bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2397bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
2398f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2399f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
2400bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2401bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
2402f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
2404bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2405bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
2406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
2408bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2409bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
2410f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
2412bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2413bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
2414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2415f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
2416bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2417bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
2418f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2419f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
2420bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2421bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
2422f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2423f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
2424bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2425bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
2426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
2428bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2429bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
2430f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2431f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
2432bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2433bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
2434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
2436bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2437bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
2438f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2439f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
2440bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2441bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
2442f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2443f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
2444bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2445bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
2446f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2447f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
2449bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        __FUNCTION__, mCameraId,
2450bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                            availableSceneModes.data.u8[i]);
2451f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2452f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2453f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
2455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
24563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
2457f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
2458f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
2459f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
24613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t flashAvailable =
24623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
24633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
2464f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
24653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAeModes =
24663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
24673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
2468f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2469f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
2470836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
24713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
24723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_AUTO);
24733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
24743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
24753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
24763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
24773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
24783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
2479f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
2480f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
2481f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
24823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
24833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
2484f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2485f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2486f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
24873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
2488f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
24893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else {
2490836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.flashMode = Parameters::FLASH_MODE_OFF;
24913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
24923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
24933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
24943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
2495f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2496f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
24973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t minFocusDistance =
24983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
24993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
25003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
25013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAfModes =
25023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
25033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
25043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2505f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
2506f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
2507836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
25083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
25093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
25103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
25113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
2512f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
2513836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
25143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
25153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
2516174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY);
2517f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
2518bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
2519f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
2520f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
2521f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2522f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
2523f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
2524bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2525bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
2526f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
2528bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2529bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
2530f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2531f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
2532bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2533bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
2534f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
2536bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2537bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
2538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
2540bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2541bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
2542f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2543bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                // Not supported in old API
2544f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
2545f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2546f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2547f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2548f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
2549f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
2550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
25543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
2555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
2556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
25583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t max3aRegions =
25593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
25603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
2561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
25623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
2563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
25643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
2565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
2566836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusingAreas.clear();
2567836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
25683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
25693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFocalLengths =
25703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
25713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
2572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
25743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
2575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
25763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t sensorSize =
25773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
25783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
2579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
2581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
2582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
2583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
2584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
25853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
25863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
2587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2588836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.exposureCompensation = 0;
25893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
2590836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                k.mParameters.exposureCompensation);
2591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
25923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
25933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
25943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
25953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
25963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
2597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
25983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
2599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
2600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
26013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationStep =
26023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
26033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
26043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
26053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
2606d6f8e08a9ca7f2fe41717acd351426a7ecb0c175Eino-Ville Talvala            (float)exposureCompensationStep.data.r[0].numerator /
2607f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
2608f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2609836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoExposureLock = false;
26103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
26113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
26123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
26133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2614f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2615836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoWhiteBalanceLock = false;
26163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
26173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
26183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
26193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2620f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2621836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
26223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
2623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
26243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
2625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
2626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2627836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.zoom = 0;
2628836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, k.mParameters.zoom);
26293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
2630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
26313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
26323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
26333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
2634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
2637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
2638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
26396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                (NUM_ZOOM_STEPS-1);
2640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
26416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
2642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
2643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
2645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
2646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
26473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
2648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2649f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
26503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
26513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
26523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
26533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
26553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
2656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
2657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
26583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxFacesDetected =
26593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
26603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
2661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            maxFacesDetected.data.i32[0]);
26623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
2663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
2664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
26653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
266678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
2667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
26683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
26693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
2670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
26713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
26723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
26743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
26753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
26763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
26773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
26783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
26793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
2680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2681f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
26823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
26833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::TRUE);
2684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
26853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
26863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FALSE);
2687f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
268936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Set up initial state for non-Camera.Parameters state variables
269036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
2691836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.storeMetadataInBuffers = true;
269236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    k.mParameters.playShutterSound = true;
2693174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    k.mParameters.afTriggerCounter = 0;
2694174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    k.mParameters.currentAfTriggerId = -1;
269578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
2696836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.paramsFlattened = params.flatten();
26973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
2699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
270061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2701836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters &params) {
2702be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2703be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2704836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
2705be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
2706be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Check if stream parameters have to change
2707be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t currentWidth, currentHeight;
2708be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->getStreamInfo(mPreviewStreamId,
2709be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &currentWidth, &currentHeight, 0);
2710be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2711be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying preview stream info: "
2712be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2713be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2714be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2715836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
2716836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight) {
27179e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
27189e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
2719836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    params.previewWidth, params.previewHeight);
2720be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->waitUntilDrained();
2721be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
2722be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
2723be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2724be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
2725be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
2726be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->deleteStream(mPreviewStreamId);
2727be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
2728be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2729be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
2730be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        strerror(-res), res);
2731be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
2732be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
2733be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mPreviewStreamId = NO_STREAM;
2734be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2735be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2736be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2737be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
2738be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mPreviewWindow,
2739836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth, params.previewHeight,
2740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
2741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mPreviewStreamId);
2742be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2743be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
2744be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
2745be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2746be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2747be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2748be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2749c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = mDevice->setStreamTransform(mPreviewStreamId,
2750836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.previewTransform);
2751c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
2752c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
2753c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2754c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return res;
2755c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
2756c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
2757be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2758be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2759be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2760836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters &params) {
2761a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
27626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
27636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
27646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
27656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
27666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
27676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
27686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
27696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
27706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
27716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2772be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2773836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateRequestCommon(mPreviewRequest, params);
2774be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2775be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of preview "
2776be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2777be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2778be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2779be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2780be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
27816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
27826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
27836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2784836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureStream(const Parameters &params) {
2785be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2786d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2787d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Find out buffer size for JPEG
2788d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_entry_t maxJpegSize =
2789d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            staticInfo(ANDROID_JPEG_MAX_SIZE);
2790d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (maxJpegSize.count == 0) {
2791d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
2792d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
2793d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return INVALID_OPERATION;
2794d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2795d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2796d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureConsumer == 0) {
2797d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create CPU buffer queue endpoint
2798d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer = new CpuConsumer(1);
2799d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
2800d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
2801d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureWindow = new SurfaceTextureClient(
2802d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->getProducerInterface());
2803d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create memory for API consumption
28049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1,
28059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                       "Camera2Client::CaptureHeap");
28069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (mCaptureHeap->mHeap->getSize() == 0) {
2807d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to allocate memory for capture",
2808d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2809d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return NO_MEMORY;
2810d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2811d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2812d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2813be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
2814d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Check if stream parameters have to change
2815d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t currentWidth, currentHeight;
2816d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->getStreamInfo(mCaptureStreamId,
2817d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &currentWidth, &currentHeight, 0);
2818d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2819d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying capture output stream info: "
2820d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2821d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2822d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2823836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.pictureWidth ||
2824836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.pictureHeight) {
2825d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            res = mDevice->deleteStream(mCaptureStreamId);
2826d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (res != OK) {
2827d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2828d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        "for capture: %s (%d)", __FUNCTION__, mCameraId,
2829d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        strerror(-res), res);
2830d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                return res;
2831d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
2832d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureStreamId = NO_STREAM;
2833d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2834d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2835be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2836be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId == NO_STREAM) {
2837be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Create stream for HAL production
2838be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mCaptureWindow,
2839836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.pictureWidth, params.pictureHeight,
2840be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
2841be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mCaptureStreamId);
2842be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2843be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for capture: "
2844be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2845be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2846be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2847be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2848be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2849d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2850d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2851be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2852836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest(const Parameters &params) {
2853d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
2854d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2855d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureRequest == NULL) {
2856d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &mCaptureRequest);
2858d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2859d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
2860d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2861d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2862d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2863d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2864be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2865836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateRequestCommon(mCaptureRequest, params);
2866be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2867be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
2868be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2869be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2870be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2871be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2872be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2873be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2874be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_THUMBNAIL_SIZE,
2875836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.jpegThumbSize, 2);
2876be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2877be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2878be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_THUMBNAIL_QUALITY,
2879836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegThumbQuality, 1);
2880be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2881be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2882be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_QUALITY,
2883836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegQuality, 1);
2884be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2885be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2886be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
2887836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegRotation, 1);
2888be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2889be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2890836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.gpsEnabled) {
2891be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2892be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
2893836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.gpsCoordinates, 3);
2894be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2895be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2896be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
2897836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.gpsTimestamp, 1);
2898be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2899be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2900be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
2901836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.gpsProcessingMethod.string(),
2902836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.gpsProcessingMethod.size());
2903be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2904be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
2905be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2906be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES);
2907be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2908be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2909be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP);
2910be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2911be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2912be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD);
2913be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2914be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2915be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2916d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2917d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2918d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2919836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters &params) {
29209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
29219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
29229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingRequest == NULL) {
29239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
29249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &mRecordingRequest);
29259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
29269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default recording request:"
29279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
29289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
29299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
29309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
29319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2932836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateRequestCommon(mRecordingRequest, params);
29339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
29349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of recording "
29359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
29369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
29379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
29389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
29399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
29409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
29419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
29429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2943836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters &params) {
29449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
29459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
29469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingConsumer == 0) {
29479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Create CPU buffer queue endpoint
2948983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingConsumer = new MediaConsumer(mRecordingHeapCount);
29499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
29509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
29519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingWindow = new SurfaceTextureClient(
29529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->getProducerInterface());
29539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Allocate memory later, since we don't know buffer size until receipt
29549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
29559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
29569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
29579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Check if stream parameters have to change
29589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint32_t currentWidth, currentHeight;
29599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->getStreamInfo(mRecordingStreamId,
29609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &currentWidth, &currentHeight, 0);
29619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
29629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying recording output stream info: "
29639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
29649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
29659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
2966836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.videoWidth ||
2967836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.videoHeight) {
29689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Should wait to be sure previous recording has finished
29699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = mDevice->deleteStream(mRecordingStreamId);
29709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) {
29719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
29729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
29739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        strerror(-res), res);
29749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return res;
29759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
29769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingStreamId = NO_STREAM;
29779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
29789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
29799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
29809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId == NO_STREAM) {
29819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createStream(mRecordingWindow,
2982836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.videoWidth, params.videoHeight,
298378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
29849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
29859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for recording: "
29869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
29879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
29889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
29899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
29909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
29919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
29929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
29939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2994836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(camera_metadata_t *request,
2995836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        const Parameters &params) {
2996be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2997be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2998be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2999836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            ANDROID_CONTROL_AE_TARGET_FPS_RANGE, params.previewFpsRange, 2);
3000be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3001be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3002836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t wbMode = params.autoWhiteBalanceLock ?
3003836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            ANDROID_CONTROL_AWB_LOCKED : params.wbMode;
3004be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3005be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AWB_MODE, &wbMode, 1);
3006be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3007be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3008836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            ANDROID_CONTROL_EFFECT_MODE, &params.effectMode, 1);
3009be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3010be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3011be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_MODE,
3012836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.antibandingMode, 1);
3013be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3014be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3015be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t controlMode =
3016836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ?
3017be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE;
3018be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3019be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_MODE, &controlMode, 1);
3020be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3021be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) {
3022be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(request,
3023be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_CONTROL_SCENE_MODE,
3024836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.sceneMode, 1);
3025be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
3026be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3027be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3028be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t flashMode = ANDROID_FLASH_OFF;
3029be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t aeMode;
3030836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.flashMode) {
3031be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
3032be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON; break;
3033be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
3034be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break;
3035be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_ON:
3036be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break;
3037be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
3038be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON;
3039be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            flashMode = ANDROID_FLASH_TORCH;
3040be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
3041be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
3042be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break;
3043be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
3044be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
3045836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.flashMode);
3046be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
3047be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3048836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED;
3049be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3050be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3051be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_FLASH_MODE, &flashMode, 1);
3052be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3053be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3054be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_MODE, &aeMode, 1);
3055be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3056be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3057be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float focusDistance = 0; // infinity focus in diopters
3058be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t focusMode;
3059836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.focusMode) {
3060be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
3061be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
3062be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
3063be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
3064be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
3065836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            focusMode = params.focusMode;
3066be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
3067be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
3068be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
3069be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            focusMode = ANDROID_CONTROL_AF_OFF;
3070be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
3071be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
3072be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
3073836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.focusMode);
3074be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
3075be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3076be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3077be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
3078be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3079be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3080be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AF_MODE, &focusMode, 1);
3081be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3082be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3083836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t focusingAreasSize = params.focusingAreas.size() * 5;
3084be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *focusingAreas = new int32_t[focusingAreasSize];
3085be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < focusingAreasSize; i += 5) {
3086836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 0] = params.focusingAreas[i].left;
3087836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 1] = params.focusingAreas[i].top;
3088836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 2] = params.focusingAreas[i].right;
3089836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 3] = params.focusingAreas[i].bottom;
3090836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 4] = params.focusingAreas[i].weight;
3091be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3092be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3093be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AF_REGIONS, focusingAreas,focusingAreasSize);
3094be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3095be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] focusingAreas;
3096be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3097be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3098be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_EXP_COMPENSATION,
3099836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.exposureCompensation, 1);
3100be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3101be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3102836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t meteringAreasSize = params.meteringAreas.size() * 5;
3103be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *meteringAreas = new int32_t[meteringAreasSize];
3104be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < meteringAreasSize; i += 5) {
3105836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 0] = params.meteringAreas[i].left;
3106836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 1] = params.meteringAreas[i].top;
3107836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 2] = params.meteringAreas[i].right;
3108836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 3] = params.meteringAreas[i].bottom;
3109836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 4] = params.meteringAreas[i].weight;
3110be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3111be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3112be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_REGIONS, meteringAreas, meteringAreasSize);
3113be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3114be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3115be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3116be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AWB_REGIONS, meteringAreas, meteringAreasSize);
3117be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3118be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] meteringAreas;
3119be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3120be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // Need to convert zoom index into a crop rectangle. The rectangle is
3121be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // chosen to maximize its area on the sensor
3122be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3123be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
3124be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM);
3125be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
3126be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            (NUM_ZOOM_STEPS-1);
3127836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    float zoomRatio = 1 + zoomIncrement * params.zoom;
3128be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3129be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t activePixelArraySize =
3130be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2);
3131be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t arrayWidth = activePixelArraySize.data.i32[0];
3132be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t arrayHeight = activePixelArraySize.data.i32[1];
3133be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
3134836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.previewWidth >= params.previewHeight) {
3135be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth =  arrayWidth / zoomRatio;
3136be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = zoomWidth *
3137836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewHeight / params.previewWidth;
3138be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
3139be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = arrayHeight / zoomRatio;
3140be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth = zoomHeight *
3141836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth / params.previewHeight;
3142be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3143be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    zoomLeft = (arrayWidth - zoomWidth) / 2;
3144be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    zoomTop = (arrayHeight - zoomHeight) / 2;
3145be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3146be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
3147be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3148be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_SCALER_CROP_REGION, cropRegion, 3);
3149be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3150be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3151be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // TODO: Decide how to map recordingHint, or whether just to ignore it
3152be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3153836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t vstabMode = params.videoStabilization ?
3154be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_ON :
3155be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
3156be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
3157be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
3158be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &vstabMode, 1);
3159be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3160be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3161be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
3162be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
3163be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3164be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateEntry(camera_metadata_t *buffer,
3165be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t tag, const void *data, size_t data_count) {
3166be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t entry;
3167be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
3168be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = find_camera_metadata_entry(buffer, tag, &entry);
3169be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
3170be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = add_camera_metadata_entry(buffer,
3171be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                tag, data, data_count);
3172be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else if (res == OK) {
3173be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = update_camera_metadata_entry(buffer,
3174be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                entry.index, data, data_count, NULL);
3175be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3176be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3177be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
3178be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
3179be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, get_camera_metadata_section_name(tag),
3180be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
3181be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3182be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return res;
3183be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
3184be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3185be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::deleteEntry(camera_metadata_t *buffer, uint32_t tag) {
3186be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t entry;
3187be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
3188be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = find_camera_metadata_entry(buffer, tag, &entry);
3189be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
3190be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return OK;
3191be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else if (res != OK) {
3192be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Error looking for entry %s.%s (%x): %s %d",
3193be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__,
3194be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_section_name(tag),
3195be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
3196be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
3197be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3198be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = delete_camera_metadata_entry(buffer, entry.index);
3199be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
3200be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Error deleting entry %s.%s (%x): %s %d",
3201be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__,
3202be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_section_name(tag),
3203be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
3204be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3205be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return res;
3206be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
3207836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
32086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) {
32096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
32106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
32116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
32126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
32136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
32146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
32156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
32166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
32176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YV12 :         // YV12
32186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
32196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
32206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
32216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
32226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
32236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
32246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
32256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
32266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
32273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) {
32283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    const char *fmt;
32293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    switch(format) {
32303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
32313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
32323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
32333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
32343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
32353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
32363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
32373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
32383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
32393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
32403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
32413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
32423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
32433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
32443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
32453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
32463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
32473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
32483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
32493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
32503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
32513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
32523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        default:
32533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
32543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    __FUNCTION__,  format);
32553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = NULL;
32563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
32573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
32583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return fmt;
32593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
32606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
32616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) {
32626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
32636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
32646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_AUTO :
32656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
32666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_INCANDESCENT :
32676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
32686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_FLUORESCENT :
32696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
32706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
32716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
32726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_DAYLIGHT :
32736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
32746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
32756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
32766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_TWILIGHT :
32776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
32786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_SHADE :
32796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
32806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
32816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
32826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) {
32836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
32846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
32856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_OFF :
32866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
32876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_MONO :
32886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
32896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_NEGATIVE :
32906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
32916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SOLARIZE :
32926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
32936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SEPIA :
32946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
32956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_POSTERIZE :
32966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
32976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_WHITEBOARD :
32986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
32996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_BLACKBOARD :
33006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
33016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_AQUA :
33026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
33036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
33046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
33056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) {
33066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
33076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
33086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
33096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
33106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_OFF :
33116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
33126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
33136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
33146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
33156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
33166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
33176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
33186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
33196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
33206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
33216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
33226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
33236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
33246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
33256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
33266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
33276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
33286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
33296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
33306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
33316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
33326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
33336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
33346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
33356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
33366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
33376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
33386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
33396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
33406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
33416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
33426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
33436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
33446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
33456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
33466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
33476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
33486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
33496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
33506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
33516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
33526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
33536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
33546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
33556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
33566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *flashMode) {
33576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
33586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
33596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
33606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
33616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
33626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
33636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
33646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
33656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
33666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
33676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
33686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
33696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
33706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
33716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
33726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *focusMode) {
33736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
33746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
33756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
33766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
33776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
33786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
33796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
33806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
33816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
33826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
33836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
33846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
33856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
33866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
33876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
33886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
33896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
33906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
33916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr,
33926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
33936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
33946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    areas->clear();
33956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areasCStr == NULL) {
33966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
33976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push();
33986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return OK;
33996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
34006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 areasStr(areasCStr);
34016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
34026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    while (areaStart != 0) {
34036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
34046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *numEnd;
34056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        int vals[NUM_FIELDS];
34066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
34076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            errno = 0;
34086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
34096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
34106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            area = numEnd + 1;
34116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
34126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push(Parameters::Area(
34136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
34146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
34156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
34166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
34176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
34186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
34196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
34206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                                      size_t maxRegions) {
34216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Definition of valid area can be found in
34226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // include/camera/CameraParameters.h
34236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
34246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 1) {
34256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (areas[0].left == 0 &&
34266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].top == 0 &&
34276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].right == 0 &&
34286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].bottom == 0 &&
34296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].weight == 0) {
34306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
34316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return OK;
34326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
34336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
34346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() > maxRegions) {
34356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Too many areas requested: %d",
34366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, areas.size());
34376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
34386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
34396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
34406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
34416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala         a != areas.end(); a++) {
34426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
34436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
34446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
34456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
34466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
34476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
34486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
34496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
34506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
34516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
34526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
34536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) {
34546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return !boolStr ? false :
34556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
34566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        false;
34576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
34586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
3459c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalaint Camera2Client::degToTransform(int degrees, bool mirror) {
3460c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (!mirror) {
3461c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (degrees == 0) return 0;
3462c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
3463c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
3464c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
3465c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    } else {  // Do mirror (horizontal flip)
3466c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (degrees == 0) {           // FLIP_H and ROT_0
3467c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H;
3468c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 90) {   // FLIP_H and ROT_90
3469c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
3470c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 180) {  // FLIP_H and ROT_180
3471c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V;
3472c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 270) {  // FLIP_H and ROT_270
3473c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
3474c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
3475c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
3476c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
3477c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return -1;
3478c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
34796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
348061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
3481