Camera2Client.cpp revision 3a609147811105d40766f8f8f5904bf71cb123cb
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),
619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingRequest(NULL)
62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
63a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const {
693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    int callingPid = getCallingPid();
703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if (callingPid == mClientPid) return NO_ERROR;
713a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    ALOGE("%s: attempt to use a locked camera from a different process"
733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    return PERMISSION_DENIED;
753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala}
763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
79a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
809e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = buildDefaultParameters();
91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
98836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        LockedParameters::Key k(mParameters);
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
101836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        ALOGD("%s", k.mParameters.paramsFlattened.string());
102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
1056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
10761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
10861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
10961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
110a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1114ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId);
1124ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
113f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    // Rewrite mClientPid to allow shutdown by CameraService
1163a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mClientPid = getCallingPid();
117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
1183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
11961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
12061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
122611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
124611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
125611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
126611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
130836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    const Parameters& p = mParameters.unsafeUnlock();
131836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1324ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append(getStateName(mState));
1337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
136836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
138836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
140836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
14111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
142836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
144836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
146836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
148836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
149836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
151836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
152836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
155836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
1567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
157836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
159836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
1607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
163836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
1647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
176836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
190836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
221836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
232836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
245836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
248836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
249836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
250836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
251836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
255836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
258836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
259836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
262836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
264836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
265836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
266836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
267836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
268836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
271836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
272836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
273836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
276836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
279836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
2823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n", mPreviewStreamId);
2833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n", mCaptureStreamId);
284836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n", mRecordingStreamId);
2853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current requests:\n");
2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mPreviewRequest != NULL) {
2883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request:\n");
2893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
290428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        dump_indented_camera_metadata(mPreviewRequest, fd, 2, 6);
2913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
2923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request: undefined\n");
2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mCaptureRequest != NULL) {
2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request:\n";
2983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
299428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        dump_indented_camera_metadata(mCaptureRequest, fd, 2, 6);
3003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
3013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request: undefined\n";
3023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
305428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    if (mRecordingRequest != NULL) {
306428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request:\n";
307428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
308428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        dump_indented_camera_metadata(mRecordingRequest, fd, 2, 6);
309428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    } else {
310428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request: undefined\n";
311428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
312428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    }
313428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
3143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
315611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
3167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
3183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
3193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
3203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
3213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
325611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
32661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
32761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3284ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) {
3294ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
3304ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    switch(state) {
3313a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        CASE_ENUM_TO_CHAR(DISCONNECTED)
3324ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
3334ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
3344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
3354ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
3364ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
3374ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
3384ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        default:
3394ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return "Unknown state!";
3404ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            break;
3414ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
3424ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR
3434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala}
3444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
34561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
34661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
348a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3499e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
350ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
3513a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
3523a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
353ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
356ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    stopPreviewLocked();
3576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
358d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mDevice->waitUntilDrained();
359d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
360d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
362d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId = NO_STREAM;
363d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
364d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
365d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
366d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mDevice->deleteStream(mCaptureStreamId);
367d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId = NO_STREAM;
3686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
370898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
371898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mDevice->deleteStream(mRecordingStreamId);
372898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mRecordingStreamId = NO_STREAM;
373898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    }
374898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
3753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
3763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mState = DISCONNECTED;
3773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
37861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
37961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
38061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
382a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3839e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
384ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
385ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
3869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
3879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
3889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
3899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
3909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
3919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
3929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
3949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = client;
3959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
39761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
39861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
39961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
400a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4019e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
402ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
405ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
41861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
41961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
42061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
421a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4229e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
423ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
426ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Check for uninterruptable conditions
4289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
4309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
4329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
43861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
43961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
442a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4439e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
444ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
447ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
4516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
455d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return setPreviewWindowLocked(binder,window);
45661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
45761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
4596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
460a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4619e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
462ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
465ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
4696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
4706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
4716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
472d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return setPreviewWindowLocked(binder, window);
4736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
4746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
475d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder,
476be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
477a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
4819e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
4829e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
4836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    switch (mState) {
4873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        case DISCONNECTED:
4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
4899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STILL_CAPTURE:
4909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
4919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
4929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
4939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
4949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
4959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
4969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
4979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
4989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
4999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Optimize this so that we don't wait for old stream to drain
5019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // before spinning up new stream
5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mDevice->setStreamingRequest(NULL);
5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mState = WAITING_FOR_PREVIEW_WINDOW;
5049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
507d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
508be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->waitUntilDrained();
509be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
510be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
511be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
512be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
516be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
5186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
5196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        mPreviewStreamId = NO_STREAM;
5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
523bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
524be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mPreviewWindow = window;
525bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
527d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return startPreviewLocked();
5286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
53161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
53261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
53361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
534a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
535ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5363a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
53861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
53961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
54061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
541a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5429e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
543ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5443a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
546d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return startPreviewLocked();
547d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
548ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
549d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::startPreviewLocked() {
550d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
5516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5524ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    if (mState >= PREVIEW) {
5534ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
5544ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                __FUNCTION__, getStateName(mState));
5554ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
5564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
5576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
558be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewWindow == 0) {
5596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = WAITING_FOR_PREVIEW_WINDOW;
5606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
5616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
562be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mState = STOPPED;
5636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
564836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
5659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
566836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updatePreviewStream(k.mParameters);
567be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
568be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
569be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
570be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
5716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
573be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewRequest == NULL) {
574836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        res = updatePreviewRequest(k.mParameters);
575be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
576be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
577be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
578be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
579be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
582be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mPreviewRequest,
583be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
584be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mPreviewStreamId, 1);
5856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
5866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
5876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
588be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
589be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
590be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = sort_camera_metadata(mPreviewRequest);
591be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
592be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
593be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
5946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
5956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
5986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
599bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
600bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
6016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = PREVIEW;
6056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
60761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
60861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
610a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6119e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
612ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
615ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    stopPreviewLocked();
616ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
617ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
618ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvalavoid Camera2Client::stopPreviewLocked() {
619ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
620d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
6213a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        case DISCONNECTED:
622d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
623d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
624d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
625d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
626d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
627d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
628d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
629d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
630d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
631d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
632d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // TODO: Handle record stop here
633d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
634d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mDevice->setStreamingRequest(NULL);
6352267106c98f461b730c772a913da946c391a178cEino-Ville Talvala            mDevice->waitUntilDrained();
636d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
637d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = STOPPED;
638d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
639d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
640d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
641d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    mState);
642d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
64361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
64461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
64561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
646a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
647ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
6503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
6516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mState == PREVIEW;
65261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
65361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
65461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
655a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
656ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6573a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
66078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    switch (mState) {
66178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        case RECORD:
66278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        case VIDEO_SNAPSHOT:
66378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
66478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
66578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
66678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
66778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
66878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
66978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
670836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
67178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
672836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.storeMetadataInBuffers = enabled;
67378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
67478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
67561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
67661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
67761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
678a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6799e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
680ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
6823a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6833a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
6849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    switch (mState) {
6859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
6869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = startPreviewLocked();
6879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
6889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
6899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
6909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
6919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
6929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
6939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
6949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to call this when recording is already on
6959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return OK;
6969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
6979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
6989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
6999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
7009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
7019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
7029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
703836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
7049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
705836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (!k.mParameters.storeMetadataInBuffers) {
70678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
70778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
70878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
70978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
71078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
71178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
712836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateRecordingStream(k.mParameters);
7139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
7159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingRequest == NULL) {
720836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        res = updateRecordingRequest(k.mParameters);
7219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
7229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
7239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
7249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
7259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
7269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId };
7299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = updateEntry(mRecordingRequest,
7309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
7319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            outputStreams, 2);
7329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
7349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = sort_camera_metadata(mRecordingRequest);
7389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
7409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mRecordingRequest);
7459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set recording request to start "
7479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "recording: %s (%d)", __FUNCTION__, mCameraId,
7489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
7499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mState = RECORD;
7529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
75461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
75561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
75661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
757a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7589e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
759ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
7613a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
7623a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    switch (mState) {
7649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
7659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
7669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
7689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
7699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STILL_CAPTURE:
7709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
7719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
7729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
7739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
7749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
7759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
7769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Back to preview. Since record can only be reached through preview,
7789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // all preview stream setup should be up to date.
7799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
7809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to switch back to preview request: "
7829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
7839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
7849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Should recording heap be freed? Can't do it yet since requests
7879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // could still be in flight.
7889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mState = PREVIEW;
79061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
79161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
79261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
793a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
794ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
7963a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return (mState == RECORD || mState == VIDEO_SNAPSHOT);
79861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
79961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
80061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
801a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
802ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8033a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8043a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
8059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Make sure this is for the current heap
8069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ssize_t offset;
8079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t size;
8089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
8099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
8109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
8119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "(got %x, expected %x)", __FUNCTION__, mCameraId,
8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
8139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
8149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
81578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint8_t *data = (uint8_t*)heap->getBase() + offset;
81678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint32_t type = *(uint32_t*)data;
81778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (type != kMetadataBufferTypeGrallocSource) {
81878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
81978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
82078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
82178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
82278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    buffer_handle_t imgBuffer = *(buffer_handle_t*)(data + 4);
82378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
824803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala            imgBuffer);
82578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    res = mRecordingConsumer->freeBuffer(imgBuffer);
82678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (res != OK) {
82778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
82878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "%s (%d)",
82978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                __FUNCTION__, mCameraId, imgBuffer, strerror(-res), res);
83078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
83178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
83278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
8339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mRecordingHeapFree++;
83461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
83561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
83661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
837a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
838ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
8413a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
8426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
84361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
84461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
84561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
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
8516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
85261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
85361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
85461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
855a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
856ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
8583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
859d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
860d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
8613a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        case DISCONNECTED:
862d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
863d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
864d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
865d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
866d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
867d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
868d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
869d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
870d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
871d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
872d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case VIDEO_SNAPSHOT:
873d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
874d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
875d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
876d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
877d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
878836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
879d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
880836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateCaptureStream(k.mParameters);
8814ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    if (res != OK) {
882be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
883be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8844ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return res;
8854ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
886d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
887d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureRequest == NULL) {
888836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        res = updateCaptureRequest(k.mParameters);
8894ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        if (res != OK) {
890be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create still image capture request: "
891be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
8924ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return res;
8934ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
894d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
895d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
896d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_entry_t outputStreams;
8979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mState == PREVIEW) {
8989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
8999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS,
9009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &streamIds, 2);
9019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    } else if (mState == RECORD) {
9029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId,
9039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                 mCaptureStreamId };
9049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS,
9059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &streamIds, 3);
9069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
9079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
908d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
909d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
910d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
911d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
912d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
913d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
914be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = sort_camera_metadata(mCaptureRequest);
915be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
916be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)",
917be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
918be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
919be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
920d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
921d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest);
922d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (captureCopy == NULL) {
923d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
924d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
925d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return NO_MEMORY;
926d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
927d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
928d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mState == PREVIEW) {
929d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->setStreamingRequest(NULL);
930d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
931d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
932d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)",
933d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
934d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
935d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
936d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
9379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
938d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = mDevice->capture(captureCopy);
939d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
940d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
941d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
942d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
943d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
944d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
945d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
946d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
947d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
948d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = STILL_CAPTURE;
949d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
950d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
951d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = VIDEO_SNAPSHOT;
952d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
953d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
954d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state for still capture!",
955d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
956d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
957d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
958d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
959d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
96061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
96161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
96261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
963a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9649e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
965ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
9673a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    LockedParameters::Key k(mParameters);
9706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    CameraParameters newParams(params);
9726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only
9746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // parameters such as supported preview sizes, etc. Should probably
9756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // produce an error if they're changed.
9766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Extract and verify new parameters */
9786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t i;
9806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_SIZE
9826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewWidth, previewHeight;
9836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPreviewSize(&previewWidth, &previewHeight);
9846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
985836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (previewWidth != k.mParameters.previewWidth ||
986836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            previewHeight != k.mParameters.previewHeight) {
9876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState >= PREVIEW) {
9886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
9899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "is active! (Currently %d x %d, requested %d x %d",
9909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__,
991836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewWidth, k.mParameters.previewHeight,
9929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    previewWidth, previewHeight);
9936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePreviewSizes =
9966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
9976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
9986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePreviewSizes.data.i32[i] == previewWidth &&
9996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePreviewSizes.data.i32[i+1] == previewHeight) break;
10006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewSizes.count) {
10026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
10036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, previewWidth, previewHeight);
10046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FPS_RANGE
100911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int previewFpsRange[2];
101011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int previewFps = 0;
10116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool fpsRangeChanged = false;
101211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]);
1013836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (previewFpsRange[0] != k.mParameters.previewFpsRange[0] ||
1014836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            previewFpsRange[1] != k.mParameters.previewFpsRange[1]) {
10156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        fpsRangeChanged = true;
10166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePreviewFpsRanges =
10176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
10186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
10196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
102011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    previewFpsRange[0]) &&
10216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
102211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    previewFpsRange[1]) ) {
10236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
10246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
10256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
10276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
102811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                __FUNCTION__, previewFpsRange[0], previewFpsRange[1]);
10296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
103111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        previewFps = previewFpsRange[0];
10326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FORMAT
10356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
1036836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (previewFormat != k.mParameters.previewFormat) {
10376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState >= PREVIEW) {
10386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
10396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "is active!", __FUNCTION__);
10406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableFormats =
10436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
10446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableFormats.count; i++) {
10456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableFormats.data.i32[i] == previewFormat) break;
10466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableFormats.count) {
10486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview format %s (0x%x) is not supported",
10496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
10506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FRAME_RATE
10556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Deprecated, only use if the preview fps range is unchanged this time.
10566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // The single-value FPS is the same as the minimum of the range.
10576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (!fpsRangeChanged) {
10586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        previewFps = newParams.getPreviewFrameRate();
1059836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (previewFps != k.mParameters.previewFps) {
10606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t availableFrameRates =
10616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
10626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
10636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (availableFrameRates.data.i32[i] == previewFps) break;
10646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
10656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableFrameRates.count) {
10666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
10676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__, previewFps);
10686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
10696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
107011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[0] = availableFrameRates.data.i32[i];
107111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[1] = availableFrameRates.data.i32[i+1];
10726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PICTURE_SIZE
10766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int pictureWidth, pictureHeight;
10776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPictureSize(&pictureWidth, &pictureHeight);
1078836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (pictureWidth == k.mParameters.pictureWidth ||
1079836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            pictureHeight == k.mParameters.pictureHeight) {
10806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePictureSizes =
10816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
10826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePictureSizes.count; i+=2) {
10836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePictureSizes.data.i32[i] == pictureWidth &&
10846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePictureSizes.data.i32[i+1] == pictureHeight) break;
10856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePictureSizes.count) {
10876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
10886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, pictureWidth, pictureHeight);
10896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
109411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int jpegThumbSize[2];
109511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    jpegThumbSize[0] =
10966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
109711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    jpegThumbSize[1] =
10986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
1099836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (jpegThumbSize[0] != k.mParameters.jpegThumbSize[0] ||
1100836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            jpegThumbSize[1] != k.mParameters.jpegThumbSize[1]) {
11016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableJpegThumbSizes =
11026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
11036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
110411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] &&
110511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) {
11066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
11076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
11086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
11106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
111111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]);
11126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
11176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegThumbQuality =
11186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
11196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
11206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
11216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegThumbQuality);
11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
11236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_QUALITY
11266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegQuality =
11276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
11286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegQuality < 0 || jpegQuality > 100) {
11296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
11306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegQuality);
11316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
11326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ROTATION
11356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegRotation =
11366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
11376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegRotation != 0 &&
11386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 90 &&
11396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 180 &&
11406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 270) {
11416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
11426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegRotation);
11436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
11446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // GPS
11476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool gpsEnabled = false;
114811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    double gpsCoordinates[3] = {0,0,0};
11496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int64_t gpsTimestamp = 0;
11506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 gpsProcessingMethod;
11516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    const char *gpsLatStr =
11526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
11536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (gpsLatStr != NULL) {
11546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsLongStr =
11556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
11566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsAltitudeStr =
11576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
11586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsTimeStr =
11596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
11606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsProcMethodStr =
11616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (gpsLongStr == NULL ||
11636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsAltitudeStr == NULL ||
11646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsTimeStr == NULL ||
11656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsProcMethodStr == NULL) {
11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *endPtr;
11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
117211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
11746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
11756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
117811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
11796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
11806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
11816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
118411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
11856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
11866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
11876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    gpsAltitudeStr);
11886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
11916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
11926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
11936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsProcessingMethod = gpsProcMethodStr;
11976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsEnabled = true;
11996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // WHITE_BALANCE
12026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int wbMode = wbModeStringToEnum(
12036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
1204836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (wbMode != k.mParameters.wbMode) {
12056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableWbModes =
12066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
12076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
12086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (wbMode == availableWbModes.data.u8[i]) break;
12096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableWbModes.count) {
12116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
12126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
12136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
12146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EFFECT
12196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int effectMode = effectModeStringToEnum(
12206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
1221836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (effectMode != k.mParameters.effectMode) {
12226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableEffectModes =
12236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
12246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
12256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (effectMode == availableEffectModes.data.u8[i]) break;
12266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableEffectModes.count) {
12286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
12296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
12306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
12316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ANTIBANDING
12366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int antibandingMode = abModeStringToEnum(
12376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
1238836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (antibandingMode != k.mParameters.antibandingMode) {
12396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableAbModes =
12406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
12416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
12426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (antibandingMode == availableAbModes.data.u8[i]) break;
12436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableAbModes.count) {
12456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
12466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
12476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
12486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // SCENE_MODE
12536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int sceneMode = sceneModeStringToEnum(
12546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
1255836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (sceneMode != k.mParameters.sceneMode) {
12566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableSceneModes =
12576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
12586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
12596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (sceneMode == availableSceneModes.data.u8[i]) break;
12606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableSceneModes.count) {
12626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
12636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
12646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
12656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FLASH_MODE
12706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::flashMode_t flashMode = flashModeStringToEnum(
12716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FLASH_MODE) );
1272836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (flashMode != k.mParameters.flashMode) {
12736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t flashAvailable =
12746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
12756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (!flashAvailable.data.u8[0] &&
12766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                flashMode != Parameters::FLASH_MODE_OFF) {
12776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
12786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
12806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
12826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t availableAeModes =
12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
12846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
12856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (flashMode == availableAeModes.data.u8[i]) break;
12866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
12876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableAeModes.count) {
12886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
12896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
12906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
12916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
12926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
12936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == -1) {
12946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
12956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
12966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
12976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_MODE
13026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::focusMode_t focusMode = focusModeStringToEnum(
13036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FOCUS_MODE));
1304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (focusMode != k.mParameters.focusMode) {
13056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (focusMode != Parameters::FOCUS_MODE_FIXED) {
13066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t minFocusDistance =
13076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
13086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (minFocusDistance.data.f[0] == 0) {
13096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
13106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        "fixed focus lens",
13116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
13126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
13136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
13146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
13156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                camera_metadata_entry_t availableFocusModes =
13166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
13176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
13186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    if (focusMode == availableFocusModes.data.u8[i]) break;
13196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
13206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (i == availableFocusModes.count) {
13216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
13226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            __FUNCTION__,
13236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
13246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    return BAD_VALUE;
13256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
13266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
13276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_AREAS
13316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> focusingAreas;
13326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
13336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &focusingAreas);
13346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t max3aRegions =
13356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
13366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
13376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
13386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
13396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
13406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
13416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EXPOSURE_COMPENSATION
13446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int exposureCompensation =
13456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
13466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
13476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
13486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
13496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            exposureCompensation > exposureCompensationRange.data.i32[1]) {
13506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
13516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, exposureCompensation);
13526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
13536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
13566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoExposureLock = boolFromString(
13576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
13586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
13606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoWhiteBalanceLock = boolFromString(
13616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
13626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // METERING_AREAS
13646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> meteringAreas;
13656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
13666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &meteringAreas);
13676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
13686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
13696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
13706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__,
13716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
13726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
13736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ZOOM
13766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
13776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
13786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
13796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, zoom);
13806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
13816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_SIZE
13846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int videoWidth, videoHeight;
13856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getVideoSize(&videoWidth, &videoHeight);
1386836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (videoWidth != k.mParameters.videoWidth ||
1387836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            videoHeight != k.mParameters.videoHeight) {
13886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState == RECORD) {
13896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Video size cannot be updated when recording is active!",
13906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
13916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
13926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableVideoSizes =
13946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
13956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
13966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableVideoSizes.data.i32[i] == videoWidth &&
13976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availableVideoSizes.data.i32[i+1] == videoHeight)  break;
13986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableVideoSizes.count) {
14006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested video size %d x %d is not supported",
14016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, videoWidth, videoHeight);
14026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
14036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // RECORDING_HINT (always supported)
14076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool recordingHint = boolFromString(
14086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
14096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_STABILIZATION
14116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool videoStabilization = boolFromString(
14126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
14136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
14146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
14156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (videoStabilization && availableVideoStabilizationModes.count == 1) {
14166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
14176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Update internal parameters */
14209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1421836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewWidth = previewWidth;
1422836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewHeight = previewHeight;
1423836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[0] = previewFpsRange[0];
1424836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[1] = previewFpsRange[1];
1425836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFps = previewFps;
1426836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFormat = previewFormat;
1427836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1428836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureWidth = pictureWidth;
1429836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureHeight = pictureHeight;
1430836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1431836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[0] = jpegThumbSize[0];
1432836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[1] = jpegThumbSize[1];
1433836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegQuality = jpegQuality;
1434836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbQuality = jpegThumbQuality;
1435836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1436836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsEnabled = gpsEnabled;
1437836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsCoordinates[0] = gpsCoordinates[0];
1438836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsCoordinates[1] = gpsCoordinates[1];
1439836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsCoordinates[2] = gpsCoordinates[2];
1440836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsTimestamp = gpsTimestamp;
1441836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsProcessingMethod = gpsProcessingMethod;
1442836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1443836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.wbMode = wbMode;
1444836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.effectMode = effectMode;
1445836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.antibandingMode = antibandingMode;
1446836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.sceneMode = sceneMode;
1447836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1448836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.flashMode = flashMode;
1449836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusMode = focusMode;
1450836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1451836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusingAreas = focusingAreas;
1452836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.exposureCompensation = exposureCompensation;
1453836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoExposureLock = autoExposureLock;
1454836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
1455836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.meteringAreas = meteringAreas;
1456836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.zoom = zoom;
1457836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1458836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoWidth = videoWidth;
1459836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoHeight = videoHeight;
1460836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1461836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.recordingHint = recordingHint;
1462836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoStabilization = videoStabilization;
1463836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1464836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updatePreviewRequest(k.mParameters);
1465be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1466be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1467be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1468be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1469be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1470836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateCaptureRequest(k.mParameters);
1471be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1472be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)",
1473be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1474be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1475be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1476be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1477836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateRecordingRequest(k.mParameters);
14789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
14799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
14809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
14819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
14829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
14839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1484be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mState == PREVIEW) {
1485be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->setStreamingRequest(mPreviewRequest);
1486be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1487be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1488be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1489be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1490be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
14919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    } else if (mState == RECORD || mState == VIDEO_SNAPSHOT) {
14929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->setStreamingRequest(mRecordingRequest);
14939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
14949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
14959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
14969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
14979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1498be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
14996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
1500836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.paramsFlattened = params;
15019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
150361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1504f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
150561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1506a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1507ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
15083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1509ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1510836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::ReadKey k(mParameters);
1511ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
15123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
1513836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    return k.mParameters.paramsFlattened;
151461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
151561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
151661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1517a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1518ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
15193a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
15203a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1521c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1522c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1523c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1524c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1525c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (cmd == CAMERA_CMD_SET_DISPLAY_ORIENTATION) {
1526836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        LockedParameters::Key k(mParameters);
1527c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        int transform = degToTransform(arg1,
1528c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                mCameraFacing == CAMERA_FACING_FRONT);
1529c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (transform == -1) {
1530c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1531c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                    __FUNCTION__, mCameraId, arg1);
1532c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
1533c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
1534836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (transform != k.mParameters.previewTransform &&
1535c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                mPreviewStreamId != NO_STREAM) {
1536c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            mDevice->setStreamTransform(mPreviewStreamId, transform);
1537c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
1538836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.previewTransform = transform;
1539c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
15403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    } else if (cmd == CAMERA_CMD_PING) {
15413a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        // Always ping back if access is proper and device is alive
15423a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        if (mState != DISCONNECTED) {
15433a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            return OK;
15443a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        } else {
15453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            return NO_INIT;
15463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        }
1547c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1548c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1549c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGE("%s: Camera %d: Unimplemented command %d (%d, %d)", __FUNCTION__,
1550c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            mCameraId, cmd, arg1, arg2);
1551c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
15526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
155361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
155461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
15553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
15563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1557d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() {
1558d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
1559d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
1560d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    sp<ICameraClient> currentClient;
15619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId);
15629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1563d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    CpuConsumer::LockedBuffer imgBuffer;
1564d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    {
1565d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        Mutex::Autolock icl(mICameraLock);
1566d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1567d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Signal errors here upstream
1568d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) {
1569d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1570d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1571d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1572d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1573d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1574d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1575d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1576d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1577d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1578d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1579d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1580d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1581d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1582d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for still image: "
1583d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
1584d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    imgBuffer.format,
1585d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    HAL_PIXEL_FORMAT_BLOB);
1586d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
1587d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1588d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1589d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1590d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Optimize this to avoid memcopy
15919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        void* captureMemory = mCaptureHeap->mHeap->getBase();
15929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size = mCaptureHeap->mHeap->getSize();
1593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        memcpy(captureMemory, imgBuffer.data, size);
1594d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1595d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->unlockBuffer(imgBuffer);
1596d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1597d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        currentClient = mCameraClient;
1598d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        switch (mState) {
1599d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case STILL_CAPTURE:
1600d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mState = STOPPED;
1601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1602d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case VIDEO_SNAPSHOT:
1603d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mState = RECORD;
1604d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1605d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            default:
1606d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
1607d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        mCameraId, mState);
1608d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1609d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1610d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1611d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Call outside mICameraLock to allow re-entrancy from notification
1612d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (currentClient != 0) {
1613d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
16149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCaptureHeap->mBuffers[0], NULL);
16159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
16169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
16179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() {
16199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
16209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
16219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<ICameraClient> currentClient;
16229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t heapIdx = 0;
16239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    nsecs_t timestamp;
16249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    {
16259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        Mutex::Autolock icl(mICameraLock);
16269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // TODO: Signal errors here upstream
1627898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        bool discardData = false;
16289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (mState != RECORD && mState != VIDEO_SNAPSHOT) {
1629898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1630898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala                    "recording done",
16319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
1632898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala            discardData = true;
16339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
16349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
163578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        buffer_handle_t imgBuffer;
163678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        res = mRecordingConsumer->getNextBuffer(&imgBuffer, &timestamp);
16379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
16389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
16399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
16409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
16419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
16429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1643898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        if (discardData) {
164478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            mRecordingConsumer->freeBuffer(imgBuffer);
16459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
16469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1647898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
164878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        if (mRecordingHeap == 0) {
164978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            const size_t bufferSize = 4 + sizeof(buffer_handle_t);
16509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
16519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "size %d bytes", __FUNCTION__, mCameraId,
16529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    kRecordingHeapCount, bufferSize);
16539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap != 0) {
16549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGV("%s: Camera %d: Previous heap has size %d "
16559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "(new will be %d) bytes", __FUNCTION__, mCameraId,
16569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        mRecordingHeap->mHeap->getSize(),
16579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        bufferSize * kRecordingHeapCount);
16589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
16599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Need to allocate memory for heap
16609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeap.clear();
16619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeap = new Camera2Heap(bufferSize, kRecordingHeapCount,
16639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "Camera2Client::RecordingHeap");
16649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap->mHeap->getSize() == 0) {
16659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
16669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        __FUNCTION__, mCameraId);
166778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mRecordingConsumer->freeBuffer(imgBuffer);
16689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
16699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
16709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapHead = 0;
16719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapFree = kRecordingHeapCount;
16729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
16739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if ( mRecordingHeapFree == 0) {
16759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
16769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
167778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            mRecordingConsumer->freeBuffer(imgBuffer);
16789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
16799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
16809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        heapIdx = mRecordingHeapHead;
16819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapHead = (mRecordingHeapHead + 1) % kRecordingHeapCount;
16829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapFree--;
16839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGV("%s: Camera %d: Timestamp %lld",
16859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, timestamp);
16869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ssize_t offset;
16889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size;
16899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        sp<IMemoryHeap> heap =
16909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
16919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        &size);
16929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
169378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
169478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint32_t type = kMetadataBufferTypeGrallocSource;
169578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        memcpy(data, &type, 4);
169678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        memcpy(data + 4, &imgBuffer, sizeof(buffer_handle_t));
169778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
1698803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala                __FUNCTION__, mCameraId, imgBuffer);
16999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        currentClient = mCameraClient;
17009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
17019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Call outside mICameraLock to allow re-entrancy from notification
17029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (currentClient != 0) {
17039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        currentClient->dataCallbackTimestamp(timestamp,
17049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                CAMERA_MSG_VIDEO_FRAME,
17059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]);
1706d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1707d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1708d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
17093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
17103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        size_t minCount, size_t maxCount) {
17113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    status_t res;
17123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t entry;
17133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
17143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            tag,
17153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            &entry);
17163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
17173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
17183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
17193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
17203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
17213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
17223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
17233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, strerror(-res), res);
17243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
17253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
17263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else if (CC_UNLIKELY(
17273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
17283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
17293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
17303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
17313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
17323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
17333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
17343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
17353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
17363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
17373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
17383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
17393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
17403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return entry;
17413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
17423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
17433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
17443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1745f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
1747a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1748836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
1749ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
17513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    CameraParameters params;
1752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableProcessedSizes =
17543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
17553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
1756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
1758836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewWidth = availableProcessedSizes.data.i32[0];
1759836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewHeight = availableProcessedSizes.data.i32[1];
1760836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoWidth = k.mParameters.previewWidth;
1761836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoHeight = k.mParameters.previewHeight;
17623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1763836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.setPreviewSize(k.mParameters.previewWidth, k.mParameters.previewHeight);
1764836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.setVideoSize(k.mParameters.videoWidth, k.mParameters.videoHeight);
17653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
17663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%dx%d",
1767836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewWidth, k.mParameters.previewHeight));
1768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1769f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
1770f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
1771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
1772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
1773f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
1774f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
1775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
17763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
1777f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
17783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
1779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
1780f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1781f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFpsRanges =
17833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
17843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
1785f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1786836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0];
1787836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1];
1788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
17903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%d,%d",
1791836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewFpsRange[0],
1792836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewFpsRange[1]));
1793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1795f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
1796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
1798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
1799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
1800f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
1801f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
18023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
1803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
1804f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1805f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1806836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
18073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
1808836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            formatEnumToString(k.mParameters.previewFormat)); // NV21
18093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1810836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewTransform = degToTransform(0,
1811c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
1812c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
18133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFormats =
18143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
1818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
1820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
1821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
1823f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1824bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1825bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
1826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1828bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1829bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1831f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
1832bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1833bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
1834f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1835f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
1836bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1837bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1838f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1839f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
1840bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1841bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
1842f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
184311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            case HAL_PIXEL_FORMAT_RGBA_8888:
184411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                supportedPreviewFormats +=
184511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGBA8888;
184611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                break;
184711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
1848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
184911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            case HAL_PIXEL_FORMAT_BLOB:
1850f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1851f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
185211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala
1853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
1854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
1855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
1856f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
18603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
1861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
1862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1865f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
1866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
1868836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.previewFpsRange[0]);
1869f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1870f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
1872f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1873f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
1874f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
1875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
1876f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
18773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
1878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
1879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegSizes =
18823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
18833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
1884f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1885f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
1886836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureWidth = availableJpegSizes.data.i32[0];
1887836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureHeight = availableJpegSizes.data.i32[1];
1888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1889836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.setPictureSize(k.mParameters.pictureWidth,
1890836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.pictureHeight);
1891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
1894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
1895f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
1896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
1897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
1898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
1899f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
19003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
1901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
1902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1903f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
19053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
19063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
1907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegThumbnailSizes =
19093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
19103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
1911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
1913836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0];
1914836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1];
1915f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
1917836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegThumbSize[0]);
19183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
1919836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegThumbSize[1]);
1920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
1923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
1924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
1925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
1926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
1927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
1928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
19293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
1930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
1931f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1933836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbQuality = 90;
19343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
1935836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegThumbQuality);
1936836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegQuality = 90;
19373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
1938836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegQuality);
1939836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegRotation = 0;
19403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
1941836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegRotation);
19423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1943836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsEnabled = false;
1944836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsProcessingMethod = "unknown";
19453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
19463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1947836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
19483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
19493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
19503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableWhiteBalanceModes =
19523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
1953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
1955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
1957f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
1958f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
1960f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
1961bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1962bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
1963f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1964f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
1965bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1966bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
1967f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1968f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
1969bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1970bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
1971f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1972f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
1973bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1974bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
1975f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1976f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
1977bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1978bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
1979f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1980f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
1981bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1982bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
1983f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1984f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
1985bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1986bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
1987f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1988f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
1989bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1990bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
1991f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1992f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
1993f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
1994f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1995f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1996f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
1997f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
1998f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
1999f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
2000f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
2001f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2002f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2003f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
20043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
2005f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
2006f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2007f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2008836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
20093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
20103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
20113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
20123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableEffects =
20133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
20143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
2015f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2016f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
2017f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
2018f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
2019f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
2020f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2021f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
2022f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
2023bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2024bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NONE;
2025f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2026f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
2027bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2028bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_MONO;
2029bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    break;
2030f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
2031bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2032bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
2033f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2034f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
2035bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2036bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
2037f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2038f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
2039bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2040bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
2041f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2042f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
2043bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2044bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
2045f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2046f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
2047bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2048bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
2049f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2050f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
2051bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2052bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
2053f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2054f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
2055bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2056bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
2057f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2058f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2059f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
2060f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
2061f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2062f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2063f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2064f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
20653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
2066f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2067f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2068836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
20693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
20703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
20713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
20723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAntibandingModes =
20733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
20743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
2075f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2076f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
2077f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
2078f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
2079f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
2080f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2081f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
2082f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
2083bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2084bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
2085f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2086f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
2087bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2088bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
2089f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2090f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
2091bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2092bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
2093f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2094f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
2095bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2096bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
2097f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2098f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2099f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
2100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
2101f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
2102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
21063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
2107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
2108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2110836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.sceneMode = ANDROID_CONTROL_OFF;
21113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
21123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
21133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
21143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableSceneModes =
21153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
21163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
2117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2118bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
2119f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
2120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
2121f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
2122f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
2123f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
2125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
2127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
2129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
2130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2131f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2132f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
2133bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2134bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
2135f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
2137bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2138bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
2139f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
2141bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2142bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
2143f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
2145bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2146bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
2147f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2148f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
2149bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2150bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
2151f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
2153bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2154bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
2155f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2156f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
2157bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2158bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
2159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2160f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
2161bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2162bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
2163f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2164f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
2165bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2166bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
2167f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2168f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
2169bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2170bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
2171f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2172f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
2173bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2174bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
2175f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2176f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
2177bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2178bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
2179f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
2181bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2182bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
2183f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2184f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
2185bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2186bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
2187f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2188f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
2189bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2190bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
2191f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2192f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2193f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
2194bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        __FUNCTION__, mCameraId,
2195bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                            availableSceneModes.data.u8[i]);
2196f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2197f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2198f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2199f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
2200f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
22013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
2202f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
2203f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
2204f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2205f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t flashAvailable =
22073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
22083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
2209f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAeModes =
22113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
22123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
2213f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2214f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
2215836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
22163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
22173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_AUTO);
22183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
22193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
22203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
22213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
22223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
22233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
2224f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
2225f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
2226f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
22273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
22283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
2229f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
22323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
2233f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
22343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else {
2235836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.flashMode = Parameters::FLASH_MODE_OFF;
22363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
22373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
22383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
22393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
2240f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2241f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t minFocusDistance =
22433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
22443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
22453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
22463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAfModes =
22473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
22483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
22493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2250f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
2251f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
2252836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
22533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
22543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
22553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
22563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
2257f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
2258836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
22593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
22603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
22613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
22623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFocusModes = supportedFocusModes + "," +
22633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FOCUS_MODE_INFINITY;
2264f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
2265bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
2266f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
2267f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
2268f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2269f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
2270f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
2271bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2272bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
2273f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2274f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
2275bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2276bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
2277f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2278f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
2279bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2280bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
2281f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2282f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
2283bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2284bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
2285f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2286f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
2287bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2288bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
2289f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2290bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                // Not supported in old API
2291f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
2292f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2293f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2294f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2295f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
2296f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
2297f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2298f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2299f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2300f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
23013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
2302f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
2303f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2304f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t max3aRegions =
23063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
23073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
2308f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
2310f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
23113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
2312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
2313836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusingAreas.clear();
2314836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
23153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
23163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFocalLengths =
23173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
23183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
2319f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2320f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
23213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
2322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t sensorSize =
23243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
23253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
2326f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2327f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
2328f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
2329f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
2330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
2331f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
23323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
23333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
2334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2335836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.exposureCompensation = 0;
23363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
2337836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                k.mParameters.exposureCompensation);
2338f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
23403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
23413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
23423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
23433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
2344f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
23453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
2346f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
2347f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationStep =
23493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
23503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
23513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
23523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
2353f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].numerator /
2354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
2355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2356836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoExposureLock = false;
23573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
23583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
23593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
23603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2362836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoWhiteBalanceLock = false;
23633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
23643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
23653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
23663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2367f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2368836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
23693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
2370f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
23713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
2372f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
2373f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2374836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.zoom = 0;
2375836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, k.mParameters.zoom);
23763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
2377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
23793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
23803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
2381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
2384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
2385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
23866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                (NUM_ZOOM_STEPS-1);
2387f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
23886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
2389f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
2390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
2392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
2393f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
23943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
2395f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2396f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
23983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
23993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
24003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2401f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
24023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
2403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
2404f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
24053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxFacesDetected =
24063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
24073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
2408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            maxFacesDetected.data.i32[0]);
24093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
2410f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
2411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
24123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
241378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
2414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
24153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
24163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
2417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
24183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
24193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2420f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
24213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
24223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
24233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
24243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
24253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
24263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
2427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2428f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
24293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
24303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::TRUE);
2431f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
24323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
24333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FALSE);
2434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
243678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    // Always use metadata mode for recording
2437836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.storeMetadataInBuffers = true;
243878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
2439836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.paramsFlattened = params.flatten();
24403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2441f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
2442f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
244361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2444836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters &params) {
2445be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2446be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2447836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
2448be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
2449be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Check if stream parameters have to change
2450be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t currentWidth, currentHeight;
2451be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->getStreamInfo(mPreviewStreamId,
2452be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &currentWidth, &currentHeight, 0);
2453be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2454be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying preview stream info: "
2455be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2456be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2457be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2458836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
2459836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight) {
24609e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
24619e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
2462836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    params.previewWidth, params.previewHeight);
2463be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->waitUntilDrained();
2464be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
2465be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
2466be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2467be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
2468be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
2469be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->deleteStream(mPreviewStreamId);
2470be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
2471be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2472be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
2473be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        strerror(-res), res);
2474be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
2475be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
2476be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mPreviewStreamId = NO_STREAM;
2477be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2478be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2479be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2480be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
2481be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mPreviewWindow,
2482836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth, params.previewHeight,
2483be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
2484be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mPreviewStreamId);
2485be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2486be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
2487be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
2488be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2489be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2490be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2491be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2492c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = mDevice->setStreamTransform(mPreviewStreamId,
2493836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.previewTransform);
2494c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
2495c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
2496c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2497c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return res;
2498c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
2499c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
2500be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2501be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2502be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2503836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters &params) {
2504a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
25056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
25066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
25076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
25086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
25096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
25106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
25116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
25126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
25136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
25146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2516836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateRequestCommon(mPreviewRequest, params);
2517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of preview "
2519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2521be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2523be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
25246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
25256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
25266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2527836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureStream(const Parameters &params) {
2528be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2529d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2530d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Find out buffer size for JPEG
2531d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_entry_t maxJpegSize =
2532d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            staticInfo(ANDROID_JPEG_MAX_SIZE);
2533d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (maxJpegSize.count == 0) {
2534d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
2535d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
2536d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return INVALID_OPERATION;
2537d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2538d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2539d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureConsumer == 0) {
2540d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create CPU buffer queue endpoint
2541d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer = new CpuConsumer(1);
2542d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
2543d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
2544d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureWindow = new SurfaceTextureClient(
2545d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->getProducerInterface());
2546d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create memory for API consumption
25479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1,
25489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                       "Camera2Client::CaptureHeap");
25499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (mCaptureHeap->mHeap->getSize() == 0) {
2550d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to allocate memory for capture",
2551d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2552d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return NO_MEMORY;
2553d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2554d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2555d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2556be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
2557d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Check if stream parameters have to change
2558d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t currentWidth, currentHeight;
2559d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->getStreamInfo(mCaptureStreamId,
2560d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &currentWidth, &currentHeight, 0);
2561d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2562d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying capture output stream info: "
2563d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2564d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2565d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2566836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.pictureWidth ||
2567836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.pictureHeight) {
2568d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            res = mDevice->deleteStream(mCaptureStreamId);
2569d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (res != OK) {
2570d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2571d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        "for capture: %s (%d)", __FUNCTION__, mCameraId,
2572d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        strerror(-res), res);
2573d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                return res;
2574d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
2575d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureStreamId = NO_STREAM;
2576d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2577d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2578be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2579be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId == NO_STREAM) {
2580be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Create stream for HAL production
2581be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mCaptureWindow,
2582836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.pictureWidth, params.pictureHeight,
2583be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
2584be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mCaptureStreamId);
2585be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2586be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for capture: "
2587be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2588be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2589be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2590be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2591be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2592d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2594be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2595836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest(const Parameters &params) {
2596d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
2597d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2598d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureRequest == NULL) {
2599d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2600d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &mCaptureRequest);
2601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2602d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
2603d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2604d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2605d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2606d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2607be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2608836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateRequestCommon(mCaptureRequest, params);
2609be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2610be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
2611be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2612be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2613be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2614be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2615be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2616be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2617be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_THUMBNAIL_SIZE,
2618836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.jpegThumbSize, 2);
2619be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2620be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2621be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_THUMBNAIL_QUALITY,
2622836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegThumbQuality, 1);
2623be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2624be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2625be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_QUALITY,
2626836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegQuality, 1);
2627be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2628be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
2630836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegRotation, 1);
2631be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2632be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2633836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.gpsEnabled) {
2634be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2635be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
2636836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.gpsCoordinates, 3);
2637be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2638be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2639be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
2640836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.gpsTimestamp, 1);
2641be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2642be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2643be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
2644836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.gpsProcessingMethod.string(),
2645836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.gpsProcessingMethod.size());
2646be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2647be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
2648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES);
2650be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2651be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2652be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP);
2653be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2654be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2655be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD);
2656be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2657be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2658be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2659d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2660d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2661d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2662836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters &params) {
26639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
26649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
26659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingRequest == NULL) {
26669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
26679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &mRecordingRequest);
26689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
26699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default recording request:"
26709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
26719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
26729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
26739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
26749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2675836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    res = updateRequestCommon(mRecordingRequest, params);
26769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
26779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of recording "
26789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
26799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
26809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
26819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
26829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
26839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
26849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
26859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2686836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters &params) {
26879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
26889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
26899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingConsumer == 0) {
26909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Create CPU buffer queue endpoint
2691803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala        mRecordingConsumer = new MediaConsumer(kRecordingHeapCount);
26929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
26939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
26949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingWindow = new SurfaceTextureClient(
26959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->getProducerInterface());
26969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Allocate memory later, since we don't know buffer size until receipt
26979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
26989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
26999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
27009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Check if stream parameters have to change
27019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint32_t currentWidth, currentHeight;
27029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->getStreamInfo(mRecordingStreamId,
27039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &currentWidth, &currentHeight, 0);
27049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
27059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying recording output stream info: "
27069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
27079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
27089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
2709836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.videoWidth ||
2710836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.videoHeight) {
27119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Should wait to be sure previous recording has finished
27129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = mDevice->deleteStream(mRecordingStreamId);
27139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) {
27149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
27159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
27169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        strerror(-res), res);
27179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return res;
27189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
27199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingStreamId = NO_STREAM;
27209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
27219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
27229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
27239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId == NO_STREAM) {
27249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createStream(mRecordingWindow,
2725836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.videoWidth, params.videoHeight,
272678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
27279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
27289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for recording: "
27299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
27309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
27319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
27329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
27339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
27349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
27359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
27369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2737836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(camera_metadata_t *request,
2738836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        const Parameters &params) {
2739be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2742836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            ANDROID_CONTROL_AE_TARGET_FPS_RANGE, params.previewFpsRange, 2);
2743be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2744be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2745836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t wbMode = params.autoWhiteBalanceLock ?
2746836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            ANDROID_CONTROL_AWB_LOCKED : params.wbMode;
2747be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2748be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AWB_MODE, &wbMode, 1);
2749be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2750be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2751836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            ANDROID_CONTROL_EFFECT_MODE, &params.effectMode, 1);
2752be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2753be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2754be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_MODE,
2755836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.antibandingMode, 1);
2756be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2757be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2758be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t controlMode =
2759836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ?
2760be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE;
2761be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2762be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_MODE, &controlMode, 1);
2763be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2764be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) {
2765be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(request,
2766be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_CONTROL_SCENE_MODE,
2767836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.sceneMode, 1);
2768be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2769be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2770be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2771be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t flashMode = ANDROID_FLASH_OFF;
2772be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t aeMode;
2773836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.flashMode) {
2774be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
2775be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON; break;
2776be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
2777be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break;
2778be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_ON:
2779be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break;
2780be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
2781be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON;
2782be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            flashMode = ANDROID_FLASH_TORCH;
2783be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2784be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
2785be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break;
2786be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
2787be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
2788836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.flashMode);
2789be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
2790be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2791836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED;
2792be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2793be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2794be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_FLASH_MODE, &flashMode, 1);
2795be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2796be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2797be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_MODE, &aeMode, 1);
2798be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2799be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2800be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float focusDistance = 0; // infinity focus in diopters
2801be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t focusMode;
2802836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.focusMode) {
2803be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
2804be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
2805be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
2806be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
2807be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
2808836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            focusMode = params.focusMode;
2809be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2810be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
2811be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
2812be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            focusMode = ANDROID_CONTROL_AF_OFF;
2813be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2814be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
2815be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
2816836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.focusMode);
2817be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
2818be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2819be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2820be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
2821be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2822be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2823be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AF_MODE, &focusMode, 1);
2824be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2825be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2826836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t focusingAreasSize = params.focusingAreas.size() * 5;
2827be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *focusingAreas = new int32_t[focusingAreasSize];
2828be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < focusingAreasSize; i += 5) {
2829836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 0] = params.focusingAreas[i].left;
2830836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 1] = params.focusingAreas[i].top;
2831836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 2] = params.focusingAreas[i].right;
2832836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 3] = params.focusingAreas[i].bottom;
2833836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 4] = params.focusingAreas[i].weight;
2834be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2835be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2836be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AF_REGIONS, focusingAreas,focusingAreasSize);
2837be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2838be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] focusingAreas;
2839be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2840be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2841be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_EXP_COMPENSATION,
2842836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.exposureCompensation, 1);
2843be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2844be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2845836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t meteringAreasSize = params.meteringAreas.size() * 5;
2846be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *meteringAreas = new int32_t[meteringAreasSize];
2847be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < meteringAreasSize; i += 5) {
2848836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 0] = params.meteringAreas[i].left;
2849836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 1] = params.meteringAreas[i].top;
2850836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 2] = params.meteringAreas[i].right;
2851836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 3] = params.meteringAreas[i].bottom;
2852836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 4] = params.meteringAreas[i].weight;
2853be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2854be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2855be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_REGIONS, meteringAreas, meteringAreasSize);
2856be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2857be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2858be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2859be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AWB_REGIONS, meteringAreas, meteringAreasSize);
2860be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2861be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] meteringAreas;
2862be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2863be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // Need to convert zoom index into a crop rectangle. The rectangle is
2864be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // chosen to maximize its area on the sensor
2865be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2866be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
2867be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM);
2868be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
2869be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            (NUM_ZOOM_STEPS-1);
2870836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    float zoomRatio = 1 + zoomIncrement * params.zoom;
2871be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2872be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t activePixelArraySize =
2873be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2);
2874be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t arrayWidth = activePixelArraySize.data.i32[0];
2875be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t arrayHeight = activePixelArraySize.data.i32[1];
2876be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
2877836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.previewWidth >= params.previewHeight) {
2878be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth =  arrayWidth / zoomRatio;
2879be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = zoomWidth *
2880836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewHeight / params.previewWidth;
2881be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
2882be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = arrayHeight / zoomRatio;
2883be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth = zoomHeight *
2884836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth / params.previewHeight;
2885be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2886be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    zoomLeft = (arrayWidth - zoomWidth) / 2;
2887be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    zoomTop = (arrayHeight - zoomHeight) / 2;
2888be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2889be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
2890be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2891be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_SCALER_CROP_REGION, cropRegion, 3);
2892be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2893be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2894be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // TODO: Decide how to map recordingHint, or whether just to ignore it
2895be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2896836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t vstabMode = params.videoStabilization ?
2897be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_ON :
2898be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
2899be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2900be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
2901be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &vstabMode, 1);
2902be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2903be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2904be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2905be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2906be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2907be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateEntry(camera_metadata_t *buffer,
2908be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t tag, const void *data, size_t data_count) {
2909be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t entry;
2910be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2911be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = find_camera_metadata_entry(buffer, tag, &entry);
2912be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
2913be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = add_camera_metadata_entry(buffer,
2914be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                tag, data, data_count);
2915be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else if (res == OK) {
2916be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = update_camera_metadata_entry(buffer,
2917be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                entry.index, data, data_count, NULL);
2918be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2919be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2920be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2921be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
2922be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, get_camera_metadata_section_name(tag),
2923be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
2924be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2925be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return res;
2926be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2927be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2928be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::deleteEntry(camera_metadata_t *buffer, uint32_t tag) {
2929be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t entry;
2930be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2931be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = find_camera_metadata_entry(buffer, tag, &entry);
2932be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
2933be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return OK;
2934be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else if (res != OK) {
2935be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Error looking for entry %s.%s (%x): %s %d",
2936be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__,
2937be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_section_name(tag),
2938be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
2939be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2940be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2941be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = delete_camera_metadata_entry(buffer, entry.index);
2942be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2943be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Error deleting entry %s.%s (%x): %s %d",
2944be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__,
2945be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_section_name(tag),
2946be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
2947be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2948be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return res;
2949be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2950836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
29516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) {
29526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
29536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
29546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
29556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
29566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
29576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
29586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
29596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
29606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YV12 :         // YV12
29616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
29626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
29636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
29646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
29656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
29666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
29676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
29686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
29696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
29703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) {
29713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    const char *fmt;
29723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    switch(format) {
29733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
29743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
29753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
29763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
29773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
29783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
29793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
29803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
29813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
29823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
29833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
29843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
29853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
29863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
29873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
29883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
29893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
29903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
29913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
29923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
29933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
29943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
29953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        default:
29963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
29973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    __FUNCTION__,  format);
29983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = NULL;
29993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
30003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
30013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return fmt;
30023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
30036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
30046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) {
30056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
30066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
30076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_AUTO :
30086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
30096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_INCANDESCENT :
30106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
30116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_FLUORESCENT :
30126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
30136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
30146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
30156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_DAYLIGHT :
30166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
30176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
30186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
30196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_TWILIGHT :
30206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
30216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_SHADE :
30226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
30236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
30246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
30256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) {
30266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
30276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
30286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_OFF :
30296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
30306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_MONO :
30316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
30326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_NEGATIVE :
30336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
30346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SOLARIZE :
30356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
30366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SEPIA :
30376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
30386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_POSTERIZE :
30396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
30406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_WHITEBOARD :
30416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
30426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_BLACKBOARD :
30436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
30446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_AQUA :
30456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
30466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
30476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
30486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) {
30496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
30506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
30516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
30526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
30536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_OFF :
30546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
30556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
30566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
30576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
30586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
30596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
30606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
30616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
30626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
30636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
30646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
30656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
30666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
30676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
30686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
30696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
30706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
30716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
30726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
30736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
30746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
30756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
30766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
30776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
30786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
30796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
30806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
30816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
30826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
30836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
30846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
30856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
30866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
30876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
30886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
30896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
30906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
30916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
30926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
30936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
30946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
30956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
30966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
30976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
30986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
30996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *flashMode) {
31006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
31016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
31026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
31036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
31046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
31056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
31066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
31076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
31086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
31096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
31106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
31116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
31126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
31136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
31146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
31156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *focusMode) {
31166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
31176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
31186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
31196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
31206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
31216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
31226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
31236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
31246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
31256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
31266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
31276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
31286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
31296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
31306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
31316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
31326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
31336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
31346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr,
31356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
31366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
31376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    areas->clear();
31386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areasCStr == NULL) {
31396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
31406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push();
31416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return OK;
31426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
31436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 areasStr(areasCStr);
31446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
31456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    while (areaStart != 0) {
31466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
31476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *numEnd;
31486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        int vals[NUM_FIELDS];
31496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
31506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            errno = 0;
31516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
31526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
31536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            area = numEnd + 1;
31546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
31556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push(Parameters::Area(
31566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
31576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
31586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
31596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
31606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
31616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
31626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
31636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                                      size_t maxRegions) {
31646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Definition of valid area can be found in
31656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // include/camera/CameraParameters.h
31666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
31676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 1) {
31686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (areas[0].left == 0 &&
31696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].top == 0 &&
31706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].right == 0 &&
31716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].bottom == 0 &&
31726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].weight == 0) {
31736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
31746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return OK;
31756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
31766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
31776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() > maxRegions) {
31786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Too many areas requested: %d",
31796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, areas.size());
31806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
31816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
31826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
31836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
31846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala         a != areas.end(); a++) {
31856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
31866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
31876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
31886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
31896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
31906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
31916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
31926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
31936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
31946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
31956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
31966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) {
31976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return !boolStr ? false :
31986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
31996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        false;
32006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
32016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
3202c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalaint Camera2Client::degToTransform(int degrees, bool mirror) {
3203c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (!mirror) {
3204c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (degrees == 0) return 0;
3205c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
3206c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
3207c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
3208c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    } else {  // Do mirror (horizontal flip)
3209c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (degrees == 0) {           // FLIP_H and ROT_0
3210c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H;
3211c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 90) {   // FLIP_H and ROT_90
3212c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
3213c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 180) {  // FLIP_H and ROT_180
3214c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V;
3215c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 270) {  // FLIP_H and ROT_270
3216c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
3217c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
3218c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
3219c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
3220c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return -1;
3221c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
32226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
322361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
3224