Camera2Client.cpp revision c8474b68e435cd840ba66791fb09e3da59f1d93c
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),
558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        mDeviceInfo(NULL),
56d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId(NO_STREAM),
57228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackStreamId(NO_STREAM),
58228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapId(0),
59d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId(NO_STREAM),
609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingStreamId(NO_STREAM),
61983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapCount(kDefaultRecordingHeapCount)
62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
63a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
64c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Created client for camera %d", __FUNCTION__, cameraId);
6561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
67228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
68228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
69228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    k.mParameters.state = DISCONNECTED;
70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const {
733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    int callingPid = getCallingPid();
743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if (callingPid == mClientPid) return NO_ERROR;
753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    ALOGE("%s: attempt to use a locked camera from a different process"
773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    return PERMISSION_DENIED;
793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala}
803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
83a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
84c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
87c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor = new FrameProcessor(this);
88c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    String8 frameThreadName = String8::format("Camera2Client[%d]::FrameProcessor",
89c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala            mCameraId);
90c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->run(frameThreadName.string());
91c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
99174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->setNotifyCallback(this);
100174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = buildDeviceInfo();
102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = buildDefaultParameters();
103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
110836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        LockedParameters::Key k(mParameters);
111f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
112f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
113836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        ALOGD("%s", k.mParameters.paramsFlattened.string());
114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
11761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
11861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
120a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
121c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Camera %d: Shutting down client.", __FUNCTION__, mCameraId);
1224ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
123f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1253a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    // Rewrite mClientPid to allow shutdown by CameraService
1263a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mClientPid = getCallingPid();
127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
128c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
129c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->requestExit();
130c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Camera %d: Shutdown complete", __FUNCTION__, mCameraId);
13161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
134611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
136611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
137611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
138611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
142836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    const Parameters& p = mParameters.unsafeUnlock();
143836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
144228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    result.append(getStateName(p.state));
1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
148836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
150836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
152836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
15311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
156836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
158836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
160836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
161836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
163836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
164836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
166836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
167836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
169836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
171836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
175836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
211836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
233836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
244836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
257836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
259836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
260836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
261836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
262836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
263836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
267836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
270836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
271836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
274836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
276836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
277836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
278836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
279836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
280836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
283836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
284836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
285836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
291836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
2927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n", mPreviewStreamId);
2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n", mCaptureStreamId);
296836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n", mRecordingStreamId);
2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current requests:\n");
299cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() != 0) {
3003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request:\n");
3013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
302cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mPreviewRequest.dump(fd, 2, 6);
3033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
3043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request: undefined\n");
3053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
308cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() != 0) {
3093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request:\n";
3103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
311cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mCaptureRequest.dump(fd, 2, 6);
3123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
3133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request: undefined\n";
3143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
317cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() != 0) {
318428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request:\n";
319428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
320cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mRecordingRequest.dump(fd, 2, 6);
321428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    } else {
322428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request: undefined\n";
323428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
324428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    }
325428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
326c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
327c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
3283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
329611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
3307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
3323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
3333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
3343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
3353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
339611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
34061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
34161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3424ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) {
3434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
3444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    switch(state) {
3453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        CASE_ENUM_TO_CHAR(DISCONNECTED)
3464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
3474ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
3484ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
3494ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
3504ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
3514ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
3524ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        default:
3534ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return "Unknown state!";
3544ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            break;
3554ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
3564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR
3574ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala}
3584ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
35961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
36061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
362a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3639e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
364ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
3653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
3663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
367ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
368f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
37036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
3716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
372d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
374d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId = NO_STREAM;
375d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
376d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
377d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
378d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mDevice->deleteStream(mCaptureStreamId);
379d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId = NO_STREAM;
3806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
382898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
383898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mDevice->deleteStream(mRecordingStreamId);
384898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mRecordingStreamId = NO_STREAM;
385898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    }
386898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
387228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackStreamId != NO_STREAM) {
388228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mDevice->deleteStream(mCallbackStreamId);
389228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackStreamId = NO_STREAM;
390228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
391228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3923a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
393228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
394228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    k.mParameters.state = DISCONNECTED;
3953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
3968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (mDeviceInfo != NULL) {
3978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        delete mDeviceInfo;
3988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        mDeviceInfo = NULL;
3998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
4008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
40161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
40261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
40361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
40461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
405a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4069e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
407ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
408ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
4109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
4119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
4149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
4178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
4188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    Mutex::Autolock iccl(mICameraClientLock);
4199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = client;
4209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
421228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
422228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    k.mParameters.state = STOPPED;
423228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
4249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
42561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
42661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
42761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
428a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4299e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
430ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
433ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
44661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
44861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
449a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4509e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
451ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
454ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Check for uninterruptable conditions
4569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
4588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        Mutex::Autolock iccl(mICameraClientLock);
4598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
46861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
46961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
472a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4739e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
474ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
477ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
48536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder,window);
48661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
48761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
4896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
490a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4919e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
492ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
495ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
5006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
5016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
50236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
5036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
5046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
50536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
506be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
507a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
5119e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
5129e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
5136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
5146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
516228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
517228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (k.mParameters.state) {
5183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        case DISCONNECTED:
5199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
5209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STILL_CAPTURE:
5219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
5229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
523228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(k.mParameters.state));
5249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
5269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
5279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
5309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
5319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Optimize this so that we don't wait for old stream to drain
5329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // before spinning up new stream
533cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
534228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            k.mParameters.state = WAITING_FOR_PREVIEW_WINDOW;
5359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
538d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
539be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->waitUntilDrained();
540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
541be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
542be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
543be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
5466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
547be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
548be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
5496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
5506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
551be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        mPreviewStreamId = NO_STREAM;
5526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
554bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
555be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mPreviewWindow = window;
556bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
557228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (k.mParameters.state == WAITING_FOR_PREVIEW_WINDOW) {
558228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return startPreviewL(k.mParameters, false);
5596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
56261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
56361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
56461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
565a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
566228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
567ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
569228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
572228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    setPreviewCallbackFlagL(k.mParameters, flag);
573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
576228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
577228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
581228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        switch(params.state) {
584228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case PREVIEW:
585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case RECORD:
588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case VIDEO_SNAPSHOT:
589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startRecordingL(params, true);
590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(params.state));
597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
60061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
60161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
603a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6049e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
605ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
609228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    return startPreviewL(k.mParameters, false);
610d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
611ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
613d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
6146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.state >= PREVIEW && !restart) {
6164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                __FUNCTION__, getStateName(params.state));
6184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
6194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
6206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
621be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewWindow == 0) {
622228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.state = WAITING_FOR_PREVIEW_WINDOW;
6236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
6246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
625228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.state = STOPPED;
6269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
627228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updatePreviewStream(params);
628be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
630be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
631be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
6326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
635228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateCallbackStream(params);
637228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
638228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
639228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
640228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
641228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
642228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
6436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
644cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
645228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updatePreviewRequest(params);
646be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
647be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
650be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
6516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
653228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
654228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[2] =
655228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                { mPreviewStreamId, mCallbackStreamId };
656cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mPreviewRequest.update(
657228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
658228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 2);
659228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else {
660cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        uint8_t outputStreams[1] = { mPreviewStreamId };
661cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mPreviewRequest.update(
662228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
663cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                outputStreams, 1);
664228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
6656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
6676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
668be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
669be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
670cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mPreviewRequest.sort();
671be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
672be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
673be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
6786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
679bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
680bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
6816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
684228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.state = PREVIEW;
6856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
68761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
68861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
68961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
690a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6919e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
692ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
69536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
696ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
697ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
69836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
699ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
700228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    State state;
701228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
702228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        LockedParameters::Key k(mParameters);
703228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        state = k.mParameters.state;
704228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
705228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
706228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
7073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        case DISCONNECTED:
708d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
709d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
710d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
711d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
712d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
713d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
714d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
715d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
716d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
717d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
718228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break - identical to preview
719d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
720cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
7212267106c98f461b730c772a913da946c391a178cEino-Ville Talvala            mDevice->waitUntilDrained();
722228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
723228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW: {
724228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            LockedParameters::Key k(mParameters);
725228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            k.mParameters.state = STOPPED;
726228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            commandStopFaceDetectionL(k.mParameters);
727d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
728228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
729d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
730d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
731228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
732d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
73361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
73461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
73561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
736a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
737ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7383a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
7403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
741228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
742228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    return k.mParameters.state == PREVIEW;
74361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
74461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
74561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
746a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
747ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
751228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
752228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (k.mParameters.state) {
75378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        case RECORD:
75478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        case VIDEO_SNAPSHOT:
75578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
756228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(k.mParameters.state));
75778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
75878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
75978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
76078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
76178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
76278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
763836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.storeMetadataInBuffers = enabled;
76478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
76578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
76661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
76761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
76861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
769a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7709e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
771ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
7733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
774228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
775228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
776228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    return startRecordingL(k.mParameters, false);
777228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
7783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
779228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
780228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
781228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
7829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
783228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
7849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
7859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
7879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
7889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
7909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
791228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
792228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
793228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
7949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
7969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
797228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(params.state));
7989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
7999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
8009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
801228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
80278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
80378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
80478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
80578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
80678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
80778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updateRecordingStream(params);
8099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
8119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
814228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
815228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
816228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateCallbackStream(params);
818228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
820228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
821228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
822228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
823228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
825cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRecordingRequest(params);
8279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
8289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
8299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
8309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
8319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
8329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
834228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
835228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[3] =
836228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                { mPreviewStreamId, mRecordingStreamId, mCallbackStreamId };
837cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
838228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
839228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 3);
840228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else {
841228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId };
842cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
843228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
844228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 2);
845228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
8489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
851cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mRecordingRequest.sort();
8529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
8549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mRecordingRequest);
8599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set recording request to start "
8619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "recording: %s (%d)", __FUNCTION__, mCameraId,
8629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
8639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
865228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.state < RECORD) {
866228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.state = RECORD;
867228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
87061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
87161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
87261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
873a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8749e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
875ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
876228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
877228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
8793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
8803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
881228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (k.mParameters.state) {
8829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
8849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
8879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STILL_CAPTURE:
8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
8909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
891228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(k.mParameters.state));
8929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
8939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
8949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Back to preview. Since record can only be reached through preview,
8969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // all preview stream setup should be up to date.
8979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
8989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to switch back to preview request: "
9009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
9019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
9029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
9039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Should recording heap be freed? Can't do it yet since requests
9059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // could still be in flight.
9069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
907228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    k.mParameters.state = PREVIEW;
90861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
90961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
91061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
911a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
912ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9138da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
9153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9168da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
9178da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
9188da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9198da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
9208da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
921228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
9228da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
923228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    return (k.mParameters.state == RECORD || k.mParameters.state == VIDEO_SNAPSHOT);
92461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
92561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
92661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
927a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
928ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9293a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9303a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
93130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
93230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    LockedParameters::Key k(mParameters);
93330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Make sure this is for the current heap
9359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ssize_t offset;
9369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t size;
9379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
9389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
9399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
9409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "(got %x, expected %x)", __FUNCTION__, mCameraId,
9419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
9429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
9439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
94478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint8_t *data = (uint8_t*)heap->getBase() + offset;
94578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint32_t type = *(uint32_t*)data;
94678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (type != kMetadataBufferTypeGrallocSource) {
94778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
94878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
94978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
95078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
95130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
95230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    // Release the buffer back to the recording queue
95330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
95430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
95530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
95630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    size_t itemIndex;
95730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
95830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
95930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
96030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                item.mGraphicBuffer->handle == imgHandle) {
96130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            break;
96230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        }
96330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
96430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    if (itemIndex == mRecordingBuffers.size()) {
96530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
96630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
96730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        return;
96830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
96930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
97078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
97130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            imgHandle);
97230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
97330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
97478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (res != OK) {
97578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
97678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "%s (%d)",
97730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
97878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
97978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
98030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    mRecordingBuffers.replaceAt(itemIndex);
98178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
9829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mRecordingHeapFree++;
98361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
98461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
98561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
986a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
987ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9883a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
991174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
992174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
993174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        LockedParameters::Key k(mParameters);
994174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        k.mParameters.currentAfTriggerId = ++k.mParameters.afTriggerCounter;
995174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        triggerId = k.mParameters.currentAfTriggerId;
996174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
997174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
998174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
999174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
100161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
100261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
100361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
1004a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1005ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
10063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
10073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1009174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1010174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
1011174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        LockedParameters::Key k(mParameters);
1012174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        triggerId = ++k.mParameters.afTriggerCounter;
1013174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1014174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1015174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1016174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
101861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
101961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
102061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
1021a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1022ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1023d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
10243a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1025d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1026228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
1027228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (k.mParameters.state) {
10283a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        case DISCONNECTED:
1029d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
1030d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
1031d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1032d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1033d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1034d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
1035d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
1036d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
1037d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
1038d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
1039d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case VIDEO_SNAPSHOT:
1040d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
1041d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1042d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1043d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1044d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1046d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1047228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updateCaptureStream(k.mParameters);
1048228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (res != OK) {
1049228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1050228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1051228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return res;
1052228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
10538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1054cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
1055228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateCaptureRequest(k.mParameters);
10564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        if (res != OK) {
1057228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't create still image capture request: "
1058228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
10594ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return res;
10604ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
1061d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1062d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1063228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = k.mParameters.previewCallbackFlags &
1064228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
1065228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool recordingEnabled = (k.mParameters.state == RECORD);
1066228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1067228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    int streamSwitch = (callbacksEnabled ? 0x2 : 0x0) +
1068228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            (recordingEnabled ? 0x1 : 0x0);
1069228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch ( streamSwitch ) {
1070228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 0: { // No recording, callbacks
1071228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
1072cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1073cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 2);
1074228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1075228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1076228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 1: { // Recording
1077228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId,
1078228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                     mCaptureStreamId };
1079cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1080cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 3);
1081228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1082228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1083228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 2: { // Callbacks
1084228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[3] = { mPreviewStreamId, mCallbackStreamId,
1085228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                     mCaptureStreamId };
1086cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1087cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 3);
1088228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1089228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1090228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 3: { // Both
1091228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[4] = { mPreviewStreamId, mCallbackStreamId,
1092228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                     mRecordingStreamId, mCaptureStreamId };
1093cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1094cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 4);
1095228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1096228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1097228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    };
1098d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1099d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
1100d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
1101d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1102d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
1103d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.sort();
1105be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1106be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)",
1107be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1108be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1109be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1110d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1111cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
1112cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
1113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
1114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
1115d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return NO_MEMORY;
1116d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1117d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1118228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (k.mParameters.state == PREVIEW) {
1119cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mDevice->clearStreamingRequest();
1120d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1121d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
1122d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)",
1123d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1124d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
1125d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1126d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
11279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
1128d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = mDevice->capture(captureCopy);
1129d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1130d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
1131d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
1132d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1133d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
1134d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1135d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1136228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (k.mParameters.state) {
1137d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
1138228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            k.mParameters.state = STILL_CAPTURE;
1139228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = commandStopFaceDetectionL(k.mParameters);
11408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            if (res != OK) {
11418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
11428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                        __FUNCTION__, mCameraId);
11438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                return res;
11448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
1145d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
1146d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
1147228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            k.mParameters.state = VIDEO_SNAPSHOT;
1148d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
1149d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
1150d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state for still capture!",
1151d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1152d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1153d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1154d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1155d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
115661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
115761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
115861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1159a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11609e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1161ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
11633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    LockedParameters::Key k(mParameters);
11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    CameraParameters newParams(params);
11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only
11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // parameters such as supported preview sizes, etc. Should probably
11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // produce an error if they're changed.
11726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Extract and verify new parameters */
11746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t i;
11766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_SIZE
11786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewWidth, previewHeight;
11796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPreviewSize(&previewWidth, &previewHeight);
11806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
1181836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (previewWidth != k.mParameters.previewWidth ||
1182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            previewHeight != k.mParameters.previewHeight) {
1183228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (k.mParameters.state >= PREVIEW) {
11846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
11859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "is active! (Currently %d x %d, requested %d x %d",
11869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__,
1187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewWidth, k.mParameters.previewHeight,
11889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    previewWidth, previewHeight);
11896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
1191cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewSizes =
11926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
11936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePreviewSizes.data.i32[i] == previewWidth &&
11956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePreviewSizes.data.i32[i+1] == previewHeight) break;
11966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewSizes.count) {
11986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
11996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, previewWidth, previewHeight);
12006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FPS_RANGE
120511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int previewFpsRange[2];
120611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int previewFps = 0;
12076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool fpsRangeChanged = false;
120811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]);
1209836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (previewFpsRange[0] != k.mParameters.previewFpsRange[0] ||
1210836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            previewFpsRange[1] != k.mParameters.previewFpsRange[1]) {
12116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        fpsRangeChanged = true;
1212cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewFpsRanges =
12136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
12146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
12156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
121611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    previewFpsRange[0]) &&
12176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
121811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    previewFpsRange[1]) ) {
12196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
12206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
12216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
12236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
122411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                __FUNCTION__, previewFpsRange[0], previewFpsRange[1]);
12256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
122711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        previewFps = previewFpsRange[0];
12286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FORMAT
12316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
1232836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (previewFormat != k.mParameters.previewFormat) {
1233228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (k.mParameters.state >= PREVIEW) {
12346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
12356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "is active!", __FUNCTION__);
12366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
1238cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t availableFormats =
12396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
12406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableFormats.count; i++) {
12416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableFormats.data.i32[i] == previewFormat) break;
12426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableFormats.count) {
12446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview format %s (0x%x) is not supported",
12456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
12466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FRAME_RATE
12516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Deprecated, only use if the preview fps range is unchanged this time.
12526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // The single-value FPS is the same as the minimum of the range.
12536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (!fpsRangeChanged) {
12546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        previewFps = newParams.getPreviewFrameRate();
1255836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (previewFps != k.mParameters.previewFps) {
1256cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            camera_metadata_ro_entry_t availableFrameRates =
12576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
12586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
12596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (availableFrameRates.data.i32[i] == previewFps) break;
12606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
12616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableFrameRates.count) {
12626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
12636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__, previewFps);
12646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
12656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
126611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[0] = availableFrameRates.data.i32[i];
126711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[1] = availableFrameRates.data.i32[i+1];
12686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PICTURE_SIZE
12726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int pictureWidth, pictureHeight;
12736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPictureSize(&pictureWidth, &pictureHeight);
1274836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (pictureWidth == k.mParameters.pictureWidth ||
1275836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            pictureHeight == k.mParameters.pictureHeight) {
1276cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t availablePictureSizes =
12776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
12786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePictureSizes.count; i+=2) {
12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePictureSizes.data.i32[i] == pictureWidth &&
12806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePictureSizes.data.i32[i+1] == pictureHeight) break;
12816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePictureSizes.count) {
12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
12846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, pictureWidth, pictureHeight);
12856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
129011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int jpegThumbSize[2];
129111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    jpegThumbSize[0] =
12926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
129311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    jpegThumbSize[1] =
12946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
1295836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (jpegThumbSize[0] != k.mParameters.jpegThumbSize[0] ||
1296836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            jpegThumbSize[1] != k.mParameters.jpegThumbSize[1]) {
1297cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t availableJpegThumbSizes =
12986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
12996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
130011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] &&
130111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) {
13026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
13036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
13046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
13066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
130711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]);
13086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
13096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
13136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegThumbQuality =
13146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
13156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
13166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
13176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegThumbQuality);
13186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
13196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_QUALITY
13226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegQuality =
13236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
13246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegQuality < 0 || jpegQuality > 100) {
13256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
13266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegQuality);
13276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
13286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ROTATION
13316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegRotation =
13326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
13336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegRotation != 0 &&
13346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 90 &&
13356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 180 &&
13366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 270) {
13376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
13386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegRotation);
13396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
13406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // GPS
13436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool gpsEnabled = false;
134411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    double gpsCoordinates[3] = {0,0,0};
13456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int64_t gpsTimestamp = 0;
13466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 gpsProcessingMethod;
13476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    const char *gpsLatStr =
13486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
13496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (gpsLatStr != NULL) {
13506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsLongStr =
13516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
13526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsAltitudeStr =
13536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
13546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsTimeStr =
13556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
13566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsProcMethodStr =
13576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
13586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (gpsLongStr == NULL ||
13596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsAltitudeStr == NULL ||
13606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsTimeStr == NULL ||
13616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsProcMethodStr == NULL) {
13626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
13636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
13646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
13656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *endPtr;
13676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
136811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
13696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
13706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
13716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
13726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
137411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
13756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
13766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
13776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
13786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
138011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
13816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
13826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
13836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    gpsAltitudeStr);
13846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
13856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
13876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
13886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
13896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
13906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
13916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsProcessingMethod = gpsProcMethodStr;
13936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsEnabled = true;
13956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // WHITE_BALANCE
13986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int wbMode = wbModeStringToEnum(
13996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
1400836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (wbMode != k.mParameters.wbMode) {
1401cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t availableWbModes =
14026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
14036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
14046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (wbMode == availableWbModes.data.u8[i]) break;
14056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableWbModes.count) {
14076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
14086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
14096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
14106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
14116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EFFECT
14156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int effectMode = effectModeStringToEnum(
14166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
1417836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (effectMode != k.mParameters.effectMode) {
1418cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t availableEffectModes =
14196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
14206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
14216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (effectMode == availableEffectModes.data.u8[i]) break;
14226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableEffectModes.count) {
14246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
14256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
14266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
14276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
14286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ANTIBANDING
14326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int antibandingMode = abModeStringToEnum(
14336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
1434836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (antibandingMode != k.mParameters.antibandingMode) {
1435cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t availableAbModes =
14366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
14376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
14386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (antibandingMode == availableAbModes.data.u8[i]) break;
14396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableAbModes.count) {
14416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
14426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
14436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
14446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
14456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // SCENE_MODE
14496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int sceneMode = sceneModeStringToEnum(
14506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
14513cc89794d92b833feff15ca76dfa196cc886e43fEino-Ville Talvala    if (sceneMode != k.mParameters.sceneMode &&
14523cc89794d92b833feff15ca76dfa196cc886e43fEino-Ville Talvala            sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) {
1453cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t availableSceneModes =
14546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
14556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
14566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (sceneMode == availableSceneModes.data.u8[i]) break;
14576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableSceneModes.count) {
14596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
14606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
14616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
14626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
14636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FLASH_MODE
14676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::flashMode_t flashMode = flashModeStringToEnum(
14686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FLASH_MODE) );
1469836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (flashMode != k.mParameters.flashMode) {
1470cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t flashAvailable =
14716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
14726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (!flashAvailable.data.u8[0] &&
14736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                flashMode != Parameters::FLASH_MODE_OFF) {
14746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
14756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
14766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
14776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
14786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
1479cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            camera_metadata_ro_entry_t availableAeModes =
14806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
14816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
14826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (flashMode == availableAeModes.data.u8[i]) break;
14836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
14846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableAeModes.count) {
14856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
14866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
14876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
14886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
14896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
14906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == -1) {
14916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
14926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
14936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
14946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
14956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
14966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
14976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
14986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_MODE
14996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::focusMode_t focusMode = focusModeStringToEnum(
15006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FOCUS_MODE));
1501836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (focusMode != k.mParameters.focusMode) {
15026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (focusMode != Parameters::FOCUS_MODE_FIXED) {
1503cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            camera_metadata_ro_entry_t minFocusDistance =
15046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
15056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (minFocusDistance.data.f[0] == 0) {
15066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
15076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        "fixed focus lens",
15086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
15096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
15106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
15116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
1512cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                camera_metadata_ro_entry_t availableFocusModes =
15136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
15146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
15156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    if (focusMode == availableFocusModes.data.u8[i]) break;
15166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
15176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (i == availableFocusModes.count) {
15186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
15196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            __FUNCTION__,
15206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
15216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    return BAD_VALUE;
15226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
15236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
15246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
15256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
15266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
15276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_AREAS
15286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> focusingAreas;
15296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
15306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &focusingAreas);
15316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t max3aRegions =
15326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
15336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
15346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
15356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
15366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
15376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
15386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
15396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
15406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EXPOSURE_COMPENSATION
15416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int exposureCompensation =
15426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
1543cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
15446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
15456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
15466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            exposureCompensation > exposureCompensationRange.data.i32[1]) {
15476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
15486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, exposureCompensation);
15496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
15506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
15516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
15526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
15536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoExposureLock = boolFromString(
15546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
15556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
15566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
15576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoWhiteBalanceLock = boolFromString(
15586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
15596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
15606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // METERING_AREAS
15616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> meteringAreas;
15626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
15636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &meteringAreas);
15646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
15656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
15666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
15676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__,
15686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
15696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
15706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
15716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
15726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ZOOM
15736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
15746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
15756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
15766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, zoom);
15776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
15786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
15796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
15806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_SIZE
15816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int videoWidth, videoHeight;
15826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getVideoSize(&videoWidth, &videoHeight);
1583836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (videoWidth != k.mParameters.videoWidth ||
1584836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            videoHeight != k.mParameters.videoHeight) {
1585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (k.mParameters.state == RECORD) {
15866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Video size cannot be updated when recording is active!",
15876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
15886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
15896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
1590cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_ro_entry_t availableVideoSizes =
15916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
15926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
15936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableVideoSizes.data.i32[i] == videoWidth &&
15946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availableVideoSizes.data.i32[i+1] == videoHeight)  break;
15956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
15966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableVideoSizes.count) {
15976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested video size %d x %d is not supported",
15986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, videoWidth, videoHeight);
15996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
16006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
16016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
16026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
16036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // RECORDING_HINT (always supported)
16046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool recordingHint = boolFromString(
16056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
16066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
16076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_STABILIZATION
16086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool videoStabilization = boolFromString(
16096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
1610cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
16116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
16126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (videoStabilization && availableVideoStabilizationModes.count == 1) {
16136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
16146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
16156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
16166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Update internal parameters */
16179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1618836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewWidth = previewWidth;
1619836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewHeight = previewHeight;
1620836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[0] = previewFpsRange[0];
1621836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[1] = previewFpsRange[1];
1622836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFps = previewFps;
1623836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFormat = previewFormat;
1624836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1625836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureWidth = pictureWidth;
1626836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureHeight = pictureHeight;
1627836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1628836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[0] = jpegThumbSize[0];
1629836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[1] = jpegThumbSize[1];
1630836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegQuality = jpegQuality;
1631836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbQuality = jpegThumbQuality;
1632836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1633836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsEnabled = gpsEnabled;
1634836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsCoordinates[0] = gpsCoordinates[0];
1635836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsCoordinates[1] = gpsCoordinates[1];
1636836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsCoordinates[2] = gpsCoordinates[2];
1637836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsTimestamp = gpsTimestamp;
1638836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsProcessingMethod = gpsProcessingMethod;
1639836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1640836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.wbMode = wbMode;
1641836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.effectMode = effectMode;
1642836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.antibandingMode = antibandingMode;
1643836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.sceneMode = sceneMode;
1644836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1645836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.flashMode = flashMode;
1646174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (focusMode != k.mParameters.focusMode) {
1647174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        k.mParameters.currentAfTriggerId = -1;
1648174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1649836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusMode = focusMode;
1650836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1651836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusingAreas = focusingAreas;
1652836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.exposureCompensation = exposureCompensation;
1653836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoExposureLock = autoExposureLock;
1654836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
1655836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.meteringAreas = meteringAreas;
1656836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.zoom = zoom;
1657836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1658836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoWidth = videoWidth;
1659836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoHeight = videoHeight;
1660836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1661836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.recordingHint = recordingHint;
1662836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoStabilization = videoStabilization;
1663836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1664836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.paramsFlattened = params;
16659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateRequests(k.mParameters);
16678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
166961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
167161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1672a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1673ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
16743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1675ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1676836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::ReadKey k(mParameters);
1677ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
16783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
1679836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    return k.mParameters.paramsFlattened;
168061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
168161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
168261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1683a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1684ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
16853a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
16863a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1687c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1688c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1689c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1690c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
169136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
169236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
169336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
169436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
169536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
169636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
169736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
169836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
169936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
170036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
170136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
170236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
170336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1704228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
1705228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            LockedParameters::Key k(mParameters);
1706228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return commandStopFaceDetectionL(k.mParameters);
1707228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
170836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
170936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
171036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
171136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
171236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
171336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
171436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
171536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
171636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1717c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
171836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
171936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
172036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
172136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
172236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
172336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
172436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
172536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
172636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
172736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
172836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
172936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
173036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
173136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
173236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    LockedParameters::Key k(mParameters);
173336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    int transform = degToTransform(degrees,
173436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
173536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
173636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
173736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
173836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
173936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
174036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform != k.mParameters.previewTransform &&
174136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mPreviewStreamId != NO_STREAM) {
174236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mDevice->setStreamTransform(mPreviewStreamId, transform);
174336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
174436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    k.mParameters.previewTransform = transform;
174536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
174636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
174736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
174836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
174936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    LockedParameters::Key k(mParameters);
175036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
175136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        k.mParameters.playShutterSound = true;
1752c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
175336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1754983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
175536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
175636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
175736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
175836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
175936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
176036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
176136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
176236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
176336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
176436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
176536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1766983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
176736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1768983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
176936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    k.mParameters.playShutterSound = false;
177036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
177136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1772983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
177336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
177436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
177536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
177636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
177736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
177836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartFaceDetectionL(int type) {
17798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
17808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
17818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
1782228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
1783228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (k.mParameters.state) {
17848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        case DISCONNECTED:
17858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        case STOPPED:
17868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
17878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        case STILL_CAPTURE:
17888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
17898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
17908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
17918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        case PREVIEW:
17928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        case RECORD:
17938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        case VIDEO_SNAPSHOT:
17948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
17958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
17968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
17978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
17988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (mDeviceInfo->bestFaceDetectMode == ANDROID_STATS_FACE_DETECTION_OFF) {
17998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
18008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
18018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return INVALID_OPERATION;
18028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
18038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (k.mParameters.enableFaceDetect) return OK;
18048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
18058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    k.mParameters.enableFaceDetect = true;
18068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
18078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateRequests(k.mParameters);
18088ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
18098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
181036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
181136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1812228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
18138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
18148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
18158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
18168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
18188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
18208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1821228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.state == PREVIEW || params.state == RECORD ||
1822228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            params.state == VIDEO_SNAPSHOT) {
1823228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
18248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
18258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
18268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
182736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
182836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
182936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
1830174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    LockedParameters::Key k(mParameters);
1831174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    k.mParameters.enableFocusMoveMessages = enable;
1832174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
183336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
183436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
183536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
183636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
183736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
1838228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
1839228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (k.mParameters.state != DISCONNECTED) {
1840983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
184136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
184236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
184336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
184436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
184536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
184636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
18478da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
184836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
184936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
185036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1851c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1852c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
185336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // 32 is the current upper limit on the video buffer count for BufferQueue
185436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (count > 32) {
185536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
185636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, count);
185736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
185836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
185936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
186036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Need to reallocate memory for heap
186136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (mRecordingHeapCount != count) {
186236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if  (mRecordingHeap != 0) {
186336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap.clear();
186436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap = NULL;
186536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        }
186636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mRecordingHeapCount = count;
186736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1868c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
18696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
187061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
187161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
18723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
18733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1874160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1875160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1876160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1877160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1878160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1879160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1880160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            frameNumber, timestamp);
1881160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1882160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1883160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1884160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1885160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1886174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1887174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1888174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1889174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1890174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1891174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
1892174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        LockedParameters::Key k(mParameters);
1893174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        switch (k.mParameters.focusMode) {
1894174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1895174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1896174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1897174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1898174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
1899174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (triggerId != k.mParameters.currentAfTriggerId) break;
1900174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1901174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1902174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1903174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1904174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1905174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1906174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        k.mParameters.currentAfTriggerId = -1;
1907174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1908174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1909174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1910174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1911174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1912174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1913174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1914174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1915174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1916174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1917174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1918174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1919174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1920174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1921174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1922174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1923174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1924174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1925174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1926174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1927174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1928174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1929174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1930174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1931174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1932174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
1933174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        if (triggerId != k.mParameters.currentAfTriggerId) break;
1934174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1935174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
1936174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        if (k.mParameters.enableFocusMoveMessages &&
1937174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                k.mParameters.afInMotion) {
1938174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1939174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1940174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        k.mParameters.currentAfTriggerId = -1;
1941174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1942174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1943174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1944174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1945174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
1946174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        if (k.mParameters.enableFocusMoveMessages &&
1947174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                k.mParameters.afInMotion) {
1948174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1949174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1950174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1951174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1952174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1953174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1954174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1955174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1956174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
1957174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        if (k.mParameters.enableFocusMoveMessages) {
1958174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1959174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1960174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1961174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1962174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                k.mParameters.afInMotion = afInMotion;
1963174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1964174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1965174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1966174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1967174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1968174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1969174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d (ID %d) in focus mode %d",
1970174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                          __FUNCTION__, newState, triggerId, k.mParameters.focusMode);
1971174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1972174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1973174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1974174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
19758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        Mutex::Autolock iccl(mICameraClientLock);
19768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (mCameraClient != 0) {
19778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
19788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
19798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1980174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1981603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
19828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        Mutex::Autolock iccl(mICameraClientLock);
19838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (mCameraClient != 0) {
19848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, success ? 1 : 0, 0);
19858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1986603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1987160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1988160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1989160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1990160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1991160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1992160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1993160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1994160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1995160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1996160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1997160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1998160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1999c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville TalvalaCamera2Client::FrameProcessor::FrameProcessor(wp<Camera2Client> client):
2000c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        Thread(false), mClient(client) {
2001c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
2002c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
2003c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville TalvalaCamera2Client::FrameProcessor::~FrameProcessor() {
2004c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Exit", __FUNCTION__);
2005c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
2006c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
2007c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalavoid Camera2Client::FrameProcessor::dump(int fd, const Vector<String16>& args) {
2008c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    String8 result("    Latest received frame:\n");
2009c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    write(fd, result.string(), result.size());
2010c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mLastFrame.dump(fd, 2, 6);
2011c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
2012c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
2013c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalabool Camera2Client::FrameProcessor::threadLoop() {
2014c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    status_t res;
2015c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
2016c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    sp<Camera2Device> device;
2017c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    {
2018c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        sp<Camera2Client> client = mClient.promote();
2019c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        if (client == 0) return false;
2020c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        device = client->mDevice;
2021c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    }
2022c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
2023c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    res = device->waitForNextFrame(kWaitDuration);
2024c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    if (res == OK) {
2025c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        sp<Camera2Client> client = mClient.promote();
2026c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        if (client == 0) return false;
2027c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        processNewFrames(client);
2028c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    } else if (res != TIMED_OUT) {
2029c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        ALOGE("Camera2Client::FrameProcessor: Error waiting for new "
2030c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                "frames: %s (%d)", strerror(-res), res);
2031c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    }
2032c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
2033c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    return true;
2034c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
2035c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
2036c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalavoid Camera2Client::FrameProcessor::processNewFrames(sp<Camera2Client> &client) {
20378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
2038cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata frame;
2039c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    while ( (res = client->mDevice->getNextFrame(&frame)) == OK) {
2040cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_entry_t entry;
2041cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry = frame.find(ANDROID_REQUEST_FRAME_COUNT);
2042cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (entry.count == 0) {
2043cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            ALOGE("%s: Camera %d: Error reading frame number: %s (%d)",
2044c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    __FUNCTION__, client->mCameraId, strerror(-res), res);
2045cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            break;
20468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
20478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2048c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        res = processFaceDetect(frame, client);
2049cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (res != OK) break;
2050c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
2051c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        mLastFrame.acquire(frame);
2052cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2053cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (res != NOT_ENOUGH_DATA) {
2054cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("%s: Camera %d: Error getting next frame: %s (%d)",
2055c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                __FUNCTION__, client->mCameraId, strerror(-res), res);
2056cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return;
20578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
2058cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
20598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return;
20608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
20618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2062c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalastatus_t Camera2Client::FrameProcessor::processFaceDetect(
2063c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    const CameraMetadata &frame, sp<Camera2Client> &client) {
20648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
2065cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t entry;
20668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    bool enableFaceDetect;
20678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    {
2068c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        LockedParameters::Key k(client->mParameters);
20698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        enableFaceDetect = k.mParameters.enableFaceDetect;
20708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
2071cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    entry = frame.find(ANDROID_STATS_FACE_DETECT_MODE);
2072cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
2073cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    // TODO: This should be an error once implementations are compliant
2074cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (entry.count == 0) {
207576dc8dacbb3e2a8c91cb526293270f9093cf8f8bEino-Ville Talvala        return OK;
20768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
2077cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
20788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    uint8_t faceDetectMode = entry.data.u8[0];
20798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
20808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (enableFaceDetect && faceDetectMode != ANDROID_STATS_FACE_DETECTION_OFF) {
2081cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry = frame.find(ANDROID_STATS_FACE_RECTANGLES);
2082cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (entry.count == 0) {
2083cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to read face rectangles",
2084c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    __FUNCTION__, client->mCameraId);
20858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
20868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
20878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        camera_frame_metadata metadata;
20888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        metadata.number_of_faces = entry.count / 4;
20898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (metadata.number_of_faces >
2090c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                client->mDeviceInfo->maxFaces) {
20918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: More faces than expected! (Got %d, max %d)",
2092c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    __FUNCTION__, client->mCameraId,
2093c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    metadata.number_of_faces, client->mDeviceInfo->maxFaces);
20948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
20958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
2096cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const int32_t *faceRects = entry.data.i32;
20978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2098cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry = frame.find(ANDROID_STATS_FACE_SCORES);
2099cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (entry.count == 0) {
2100cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to read face scores",
2101c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    __FUNCTION__, client->mCameraId);
21028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
21038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
2104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const uint8_t *faceScores = entry.data.u8;
21058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2106cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const int32_t *faceLandmarks = NULL;
2107cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const int32_t *faceIds = NULL;
21088ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
21098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (faceDetectMode == ANDROID_STATS_FACE_DETECTION_FULL) {
2110cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            entry = frame.find(ANDROID_STATS_FACE_LANDMARKS);
2111cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            if (entry.count == 0) {
2112cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to read face landmarks",
2113c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                        __FUNCTION__, client->mCameraId);
21148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                return res;
21158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
21168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            faceLandmarks = entry.data.i32;
21178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2118cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            entry = frame.find(ANDROID_STATS_FACE_IDS);
2119cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
2120cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            if (entry.count == 0) {
2121cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to read face IDs",
2122c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                        __FUNCTION__, client->mCameraId);
21238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                return res;
21248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
21258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            faceIds = entry.data.i32;
21268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
21278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
21288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        Vector<camera_face_t> faces;
21298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        faces.setCapacity(metadata.number_of_faces);
21308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
21318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        for (int i = 0; i < metadata.number_of_faces; i++) {
21328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            camera_face_t face;
21338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2134c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala            face.rect[0] = client->arrayXToNormalized(faceRects[i*4 + 0]);
2135c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala            face.rect[1] = client->arrayYToNormalized(faceRects[i*4 + 1]);
2136c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala            face.rect[2] = client->arrayXToNormalized(faceRects[i*4 + 2]);
2137c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala            face.rect[3] = client->arrayYToNormalized(faceRects[i*4 + 3]);
21388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
21398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            face.score = faceScores[i];
21408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            if (faceDetectMode == ANDROID_STATS_FACE_DETECTION_FULL) {
21418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                face.id = faceIds[i];
2142c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.left_eye[0] =
2143c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                        client->arrayXToNormalized(faceLandmarks[i*6 + 0]);
2144c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.left_eye[1] =
2145c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                        client->arrayYToNormalized(faceLandmarks[i*6 + 1]);
2146c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.right_eye[0] =
2147c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                        client->arrayXToNormalized(faceLandmarks[i*6 + 2]);
2148c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.right_eye[1] =
2149c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                        client->arrayYToNormalized(faceLandmarks[i*6 + 3]);
2150c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.mouth[0] =
2151c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                        client->arrayXToNormalized(faceLandmarks[i*6 + 4]);
2152c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.mouth[1] =
2153c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                        client->arrayYToNormalized(faceLandmarks[i*6 + 5]);
21548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            } else {
21558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                face.id = 0;
21568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                face.left_eye[0] = face.left_eye[1] = -2000;
21578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                face.right_eye[0] = face.right_eye[1] = -2000;
21588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                face.mouth[0] = face.mouth[1] = -2000;
21598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
21608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            faces.push_back(face);
21618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
21628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
21638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        metadata.faces = faces.editArray();
21648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        {
2165c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala            Mutex::Autolock iccl(client->mICameraClientLock);
2166c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala            if (client->mCameraClient != NULL) {
2167c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                client->mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_METADATA,
21688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                        NULL, &metadata);
21698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
21708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
21718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
21728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return OK;
21738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
21748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2175228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::onCallbackAvailable() {
2176d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
2177d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2178228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Preview callback available", __FUNCTION__, mCameraId);
2179228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2180228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    int callbackHeapId;
2181228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> callbackHeap;
2182228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    size_t heapIdx;
21839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2184d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    CpuConsumer::LockedBuffer imgBuffer;
2185228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Getting buffer", __FUNCTION__);
2186228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = mCallbackConsumer->lockNextBuffer(&imgBuffer);
2187228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (res != OK) {
2188228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGE("%s: Camera %d: Error receiving next callback buffer: "
2189228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2190228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return;
2191228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2192228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2193d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    {
2194228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        LockedParameters::Key k(mParameters);
2195d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2196228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if ( k.mParameters.state != PREVIEW && k.mParameters.state != RECORD
2197228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                && k.mParameters.state != VIDEO_SNAPSHOT) {
2198228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: No longer streaming",
2199228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2200228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
2201228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
2202228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2203228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2204228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (! (k.mParameters.previewCallbackFlags &
2205228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ) {
2206228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: No longer enabled, dropping", __FUNCTION__);
2207228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
2208228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
2209228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2210228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if ((k.mParameters.previewCallbackFlags &
2211228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) &&
2212228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                !k.mParameters.previewCallbackOneShot) {
2213228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: One shot mode, already sent, dropping", __FUNCTION__);
2214228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
2215228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
2216228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2217228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2218228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (imgBuffer.format != k.mParameters.previewFormat) {
2219228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for callback: "
2220228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
2221228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    imgBuffer.format, k.mParameters.previewFormat);
2222228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
2223228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
2224228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2225228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2226228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        size_t bufferSize = calculateBufferSize(imgBuffer.width, imgBuffer.height,
2227228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                imgBuffer.format, imgBuffer.stride);
2228228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        size_t currentBufferSize = (mCallbackHeap == 0) ?
2229228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                0 : (mCallbackHeap->mHeap->getSize() / kCallbackHeapCount);
2230228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (bufferSize != currentBufferSize) {
2231228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeap.clear();
2232228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeap = new Camera2Heap(bufferSize, kCallbackHeapCount,
2233228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "Camera2Client::CallbackHeap");
2234228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (mCallbackHeap->mHeap->getSize() == 0) {
2235228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for callbacks",
2236228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        __FUNCTION__, mCameraId);
2237228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                mCallbackConsumer->unlockBuffer(imgBuffer);
2238228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                return;
2239228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
2240228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2241228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeapHead = 0;
2242228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeapFree = kCallbackHeapCount;
2243228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeapId++;
2244228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2245228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2246228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (mCallbackHeapFree == 0) {
2247228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: No free callback buffers, dropping frame",
2248d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2249228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
2250d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
2251d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2252228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        heapIdx = mCallbackHeapHead;
2253228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        callbackHeap = mCallbackHeap;
2254228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        callbackHeapId = mCallbackHeapId;
2255228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2256228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapHead = (mCallbackHeapHead + 1) & kCallbackHeapCount;
2257228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapFree--;
2258228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2259228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Get rid of this memcpy by passing the gralloc queue all the way
2260228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // to app
2261228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2262228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ssize_t offset;
2263228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        size_t size;
2264228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        sp<IMemoryHeap> heap =
2265228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeap->mBuffers[heapIdx]->getMemory(&offset,
2266228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    &size);
2267228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
2268228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        memcpy(data, imgBuffer.data, bufferSize);
2269228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2270228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: Freeing buffer", __FUNCTION__);
2271228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer->unlockBuffer(imgBuffer);
2272228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2273228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // In one-shot mode, stop sending callbacks after the first one
2274228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (k.mParameters.previewCallbackFlags &
2275228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
2276228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: clearing oneshot", __FUNCTION__);
2277228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            k.mParameters.previewCallbackOneShot = false;
2278228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2279228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2280228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2281228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside parameter lock to allow re-entrancy from notification
2282228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
2283228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        Mutex::Autolock iccl(mICameraClientLock);
2284228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (mCameraClient != 0) {
2285228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: Invoking client data callback",
2286228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2287228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_FRAME,
2288228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    callbackHeap->mBuffers[heapIdx], NULL);
2289228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2290228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2291228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2292228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    LockedParameters::Key k(mParameters);
2293228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Only increment free if we're still using the same heap
2294228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackHeapId == callbackHeapId) {
2295228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapFree++;
2296228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2297228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2298228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: exit", __FUNCTION__);
2299228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
2300228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2301228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() {
2302228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ATRACE_CALL();
2303228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
2304228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> captureHeap;
2305228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId);
2306228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2307228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
2308228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        LockedParameters::Key k(mParameters);
2309228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CpuConsumer::LockedBuffer imgBuffer;
2310d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2311d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
2312d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2313d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
2314d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
2315d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
2316d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2317d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2318228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Signal errors here upstream
2319228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (k.mParameters.state != STILL_CAPTURE &&
2320228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                k.mParameters.state != VIDEO_SNAPSHOT) {
2321228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Still image produced unexpectedly!",
2322228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2323228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
2324228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
2325228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2326228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2327d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
2328d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for still image: "
2329d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
2330d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    imgBuffer.format,
2331d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    HAL_PIXEL_FORMAT_BLOB);
2332d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
2333d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
2334d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2335d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2336d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Optimize this to avoid memcopy
23379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        void* captureMemory = mCaptureHeap->mHeap->getBase();
23389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size = mCaptureHeap->mHeap->getSize();
2339d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        memcpy(captureMemory, imgBuffer.data, size);
2340d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2341d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->unlockBuffer(imgBuffer);
2342d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2343228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        switch (k.mParameters.state) {
2344d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case STILL_CAPTURE:
2345228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                k.mParameters.state = STOPPED;
2346d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
2347d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case VIDEO_SNAPSHOT:
2348228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                k.mParameters.state = RECORD;
2349d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
2350d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            default:
2351d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
2352228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mCameraId, k.mParameters.state);
2353d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
2354d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
23558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2356228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        captureHeap = mCaptureHeap;
2357d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2358228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside parameter locks to allow re-entrancy from notification
2359228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    Mutex::Autolock iccl(mICameraClientLock);
2360228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCameraClient != 0) {
2361228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
2362228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                captureHeap->mBuffers[0], NULL);
23639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
23649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
23659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
23669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() {
23679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
23689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
2369228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> recordingHeap;
23709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t heapIdx = 0;
23719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    nsecs_t timestamp;
23729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    {
2373228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        LockedParameters::Key k(mParameters);
23749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
237530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        BufferItemConsumer::BufferItem imgBuffer;
237630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        res = mRecordingConsumer->acquireBuffer(&imgBuffer);
23779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
23789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
23799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
23809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
23819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
238230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        timestamp = imgBuffer.mTimestamp;
23839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2384228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount++;
2385228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
2386228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2387228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Signal errors here upstream
2388228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (k.mParameters.state != RECORD &&
2389228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                k.mParameters.state != VIDEO_SNAPSHOT) {
2390228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
2391228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "recording done",
2392228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
239330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
23949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
23959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
2396898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
239778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        if (mRecordingHeap == 0) {
239878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            const size_t bufferSize = 4 + sizeof(buffer_handle_t);
23999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
24009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "size %d bytes", __FUNCTION__, mCameraId,
2401983cf231ab2d176a14595cdae46ff1b0c239af47James Dong                    mRecordingHeapCount, bufferSize);
24029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2403983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
24049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "Camera2Client::RecordingHeap");
24059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap->mHeap->getSize() == 0) {
24069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
24079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        __FUNCTION__, mCameraId);
240830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingConsumer->releaseBuffer(imgBuffer);
24099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
24109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
241130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
241230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                if (mRecordingBuffers[i].mBuf !=
241330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                        BufferItemConsumer::INVALID_BUFFER_SLOT) {
241430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    ALOGE("%s: Camera %d: Non-empty recording buffers list!",
241530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                            __FUNCTION__, mCameraId);
241630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                }
241730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            }
241830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.clear();
241930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.setCapacity(mRecordingHeapCount);
242030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.insertAt(0, mRecordingHeapCount);
242130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
24229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapHead = 0;
2423983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeapFree = mRecordingHeapCount;
24249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
24259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
24269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if ( mRecordingHeapFree == 0) {
24279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
24289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
242930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
24309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
24319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
2432228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
24339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        heapIdx = mRecordingHeapHead;
2434983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
24359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapFree--;
24369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
24379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGV("%s: Camera %d: Timestamp %lld",
24389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, timestamp);
24399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
24409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ssize_t offset;
24419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size;
24429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        sp<IMemoryHeap> heap =
24439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
24449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        &size);
24459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
244678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
244778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint32_t type = kMetadataBufferTypeGrallocSource;
244830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((uint32_t*)data) = type;
244930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
245078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
245130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
245230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
2453228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        recordingHeap = mRecordingHeap;
24549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
2455228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2456228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside locked parameters to allow re-entrancy from notification
2457228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    Mutex::Autolock iccl(mICameraClientLock);
2458228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCameraClient != 0) {
2459228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCameraClient->dataCallbackTimestamp(timestamp,
24609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                CAMERA_MSG_VIDEO_FRAME,
2461228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                recordingHeap->mBuffers[heapIdx]);
2462d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2463d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2464d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2465cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_ro_entry_t Camera2Client::staticInfo(uint32_t tag,
2466cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t minCount, size_t maxCount) const {
24673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    status_t res;
2468cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t entry = mDevice->info().find(tag);
2469cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
2470cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (CC_UNLIKELY( entry.count == 0 )) {
24713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
24723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
24733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
24743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
24753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2476cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x)",
2477cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                tagSection, tagName, tag);
24783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else if (CC_UNLIKELY(
24793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
24803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
24813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
24823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
24833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
24843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
24853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
24863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
24873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
24883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
24893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
24903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return entry;
24913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
24923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
24933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
24943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
24958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Client::buildDeviceInfo() {
24968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (mDeviceInfo != NULL) {
24978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        delete mDeviceInfo;
24988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
24998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    DeviceInfo *deviceInfo = new DeviceInfo;
25008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    mDeviceInfo = deviceInfo;
25018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2502cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t activeArraySize =
25038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2);
25048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (!activeArraySize.count) return NO_INIT;
25058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    deviceInfo->arrayWidth = activeArraySize.data.i32[0];
25068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    deviceInfo->arrayHeight = activeArraySize.data.i32[1];
25078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2508cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableFaceDetectModes =
25098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        staticInfo(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES);
25108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (!availableFaceDetectModes.count) return NO_INIT;
25118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
25128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    deviceInfo->bestFaceDetectMode =
25138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ANDROID_STATS_FACE_DETECTION_OFF;
25148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) {
25158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        switch (availableFaceDetectModes.data.u8[i]) {
25168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            case ANDROID_STATS_FACE_DETECTION_OFF:
25178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                break;
25188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            case ANDROID_STATS_FACE_DETECTION_SIMPLE:
25198ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                if (deviceInfo->bestFaceDetectMode !=
25208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                        ANDROID_STATS_FACE_DETECTION_FULL) {
25218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    deviceInfo->bestFaceDetectMode =
25228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                        ANDROID_STATS_FACE_DETECTION_SIMPLE;
25238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                }
25248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                break;
25258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            case ANDROID_STATS_FACE_DETECTION_FULL:
25268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                deviceInfo->bestFaceDetectMode =
25278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    ANDROID_STATS_FACE_DETECTION_FULL;
25288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                break;
25298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            default:
25308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unknown face detect mode %d:",
25318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                        __FUNCTION__, mCameraId,
25328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                        availableFaceDetectModes.data.u8[i]);
25338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                return NO_INIT;
25348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
25358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
25368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2537cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t maxFacesDetected =
25388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
25398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (!maxFacesDetected.count) return NO_INIT;
25408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
25418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    deviceInfo->maxFaces = maxFacesDetected.data.i32[0];
25428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
25438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return OK;
25448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
2545f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2546f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
2547a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2548836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    LockedParameters::Key k(mParameters);
2549ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
2550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
25513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    CameraParameters params;
2552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2553cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableProcessedSizes =
25543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
25553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
2556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
2558836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewWidth = availableProcessedSizes.data.i32[0];
2559836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewHeight = availableProcessedSizes.data.i32[1];
2560836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoWidth = k.mParameters.previewWidth;
2561836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.videoHeight = k.mParameters.previewHeight;
25623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2563836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.setPreviewSize(k.mParameters.previewWidth, k.mParameters.previewHeight);
2564836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.setVideoSize(k.mParameters.videoWidth, k.mParameters.videoHeight);
25653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
25663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%dx%d",
2567836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewWidth, k.mParameters.previewHeight));
2568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
2570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
2571f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
2572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
2573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
2574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
2575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
25763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
2577f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
25783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
2579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
2580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2582cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableFpsRanges =
25833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
25843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
2585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2586836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0];
2587836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1];
2588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
25893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
25903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%d,%d",
2591836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewFpsRange[0],
2592836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    k.mParameters.previewFpsRange[1]));
2593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
2596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
2597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
2598f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
2599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
2600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
2601f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
26023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
2603f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
2604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2606836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
26073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
2608836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            formatEnumToString(k.mParameters.previewFormat)); // NV21
26093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2610836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.previewTransform = degToTransform(0,
2611c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
2612c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
2613cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableFormats =
26143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
2615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2616f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2617f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
2618f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
2619f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
2620f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
2621f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2622f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
2623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
2624bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
2625bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
2626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
2628bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
2629bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
2630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
2632bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
2633bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
2634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
2636bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
2637bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
2638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
2640bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
2641bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
2642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
264311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            case HAL_PIXEL_FORMAT_RGBA_8888:
264411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                supportedPreviewFormats +=
264511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGBA8888;
264611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                break;
264711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
2648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
264911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            case HAL_PIXEL_FORMAT_BLOB:
2650f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
2651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
265211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala
2653f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
2654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
2655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
2656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
2657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
26603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
2661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
2662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
2665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
2666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
26673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
2668836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.previewFpsRange[0]);
2669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
2672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
2673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
2674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
2675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
2676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
26773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
2678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
2679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2681cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegSizes =
26823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
26833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
2684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
2686836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureWidth = availableJpegSizes.data.i32[0];
2687836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.pictureHeight = availableJpegSizes.data.i32[1];
2688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2689836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.setPictureSize(k.mParameters.pictureWidth,
2690836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.pictureHeight);
2691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
2694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
2695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
2696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
2697f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
2698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
2699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
27003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
2701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
2702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
27043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
27053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
27063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
2707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2708cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegThumbnailSizes =
27093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
27103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
2711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
2713836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0];
2714836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1];
2715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
27163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
2717836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegThumbSize[0]);
27183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
2719836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegThumbSize[1]);
2720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
2723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
2724f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
2725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
2726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
2727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
2728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
27293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
2730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
2731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2733836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegThumbQuality = 90;
27343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
2735836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegThumbQuality);
2736836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegQuality = 90;
27373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
2738836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegQuality);
2739836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.jpegRotation = 0;
27403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
2741836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            k.mParameters.jpegRotation);
27423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2743836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsEnabled = false;
2744836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.gpsProcessingMethod = "unknown";
27453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
27463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2747836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
27483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
27493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
27503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2751cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableWhiteBalanceModes =
27523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
2753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
2755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
2756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
2757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
2758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
2760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
2761bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2762bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
2763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
2765bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2766bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
2767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
2769bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2770bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
2771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
2773bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2774bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
2775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2776f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
2777bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2778bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
2779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2780f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
2781bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2782bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
2783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2784f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
2785bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2786bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
2787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
2789bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
2790bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
2791f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
2793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
2794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
2795f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
2797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
2798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
2799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
2800f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
2801f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2802f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
28043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
2805f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
2806f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2808836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
28093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
28103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
28113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2812cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableEffects =
28133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
28143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
2815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
2817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
2818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
2819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
2820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
2822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
2823bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2824bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NONE;
2825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
2827bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2828bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_MONO;
2829bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    break;
2830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
2831bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2832bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
2833f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2834f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
2835bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2836bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
2837f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2838f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
2839bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2840bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
2841f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2842f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
2843bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2844bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
2845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2846f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
2847bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2848bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
2849f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2850f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
2851bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2852bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
2853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
2855bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
2856bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
2857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
2860f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
2861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
28653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
2866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2868836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
28693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
28703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
28713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2872cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableAntibandingModes =
28733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
28743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
2875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2876f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
2877f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
2878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
2879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
2880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2881f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
2882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
2883bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2884bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
2885f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
2887bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2888bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
2889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
2891bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2892bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
2893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
2895bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
2896bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
2897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2899f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
2900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
2901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
2902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2903f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2904f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2905f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
29063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
2907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
2908f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2910836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.sceneMode = ANDROID_CONTROL_OFF;
29113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
29123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
29133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2914cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
29153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
29163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
2917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2918bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
2919f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
2920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
2921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
2922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
2923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
2925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
2927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
2929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
2930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2931f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
2933bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2934bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
2935f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
2937bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2938bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
2939f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
2941bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2942bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
2943f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
2945bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2946bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
2947f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
2949bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2950bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
2951f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
2953bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2954bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
2955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
2957bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2958bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
2959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2960f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
2961bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2962bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
2963f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2964f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
2965bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2966bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
2967f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2968f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
2969bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2970bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
2971f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2972f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
2973bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2974bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
2975f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2976f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
2977bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2978bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
2979f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2980f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
2981bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2982bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
2983f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2984f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
2985bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2986bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
2987f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2988f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
2989bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2990bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
2991f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2992f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2993f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
2994bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        __FUNCTION__, mCameraId,
2995bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                            availableSceneModes.data.u8[i]);
2996f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2997f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2998f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2999f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
3000f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
30013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
3002f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
3003f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
3004f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
3005f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3006cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t flashAvailable =
30073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
30083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
3009f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3010cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableAeModes =
30113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
30123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
3013f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3014f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
3015836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
30163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
30173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_AUTO);
30183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
30193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
30203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
30213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
30223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
30233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
3024f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
3025f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
3026f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
30273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
30283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
3029f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
3030f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
3031f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
30323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
3033f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
30343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else {
3035836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.flashMode = Parameters::FLASH_MODE_OFF;
30363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
30373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
30383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
30393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
3040f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
3041f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3042cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
30433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
30443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
30453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
3046cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableAfModes =
30473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
30483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
30493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
3050f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
3051f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
3052836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
30533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
30543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
30553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
30563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
3057f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
3058836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        k.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
30593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
30603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
3061174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY);
3062f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
3063bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
3064f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
3065f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
3066f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
3067f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
3068f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
3069bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
3070bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
3071f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
3072f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
3073bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
3074bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
3075f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
3076f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
3077bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
3078bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
3079f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
3080f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
3081bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
3082bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
3083f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
3084f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
3085bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
3086bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
3087f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
3088bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                // Not supported in old API
3089f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
3090f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
3091f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
3092f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
3093f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
3094f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
3095f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
3096f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
3097f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
3098f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
30993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
3100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
3101f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
3102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3103cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t max3aRegions =
31043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
31053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
3106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
31073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
3108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
31093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
3110f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
3111836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusingAreas.clear();
3112836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
31133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
3114cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
31153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
31163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
3117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3118f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
31193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
3120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3121cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t sensorSize =
31223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
31233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
3124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
3126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
3127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
3128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
3129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
31303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
31313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
3132f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3133836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.exposureCompensation = 0;
31343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
3135836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                k.mParameters.exposureCompensation);
3136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3137cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
31383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
31393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
31403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
31413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
3142f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
31433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
3144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
3145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3146cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationStep =
31473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
31483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
31493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
31503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
3151d6f8e08a9ca7f2fe41717acd351426a7ecb0c175Eino-Ville Talvala            (float)exposureCompensationStep.data.r[0].numerator /
3152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
3153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoExposureLock = false;
31553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
31563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
31573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
31583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
3159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3160836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.autoWhiteBalanceLock = false;
31613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
31623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
31633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
31643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
3165f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3166836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
31673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
3168f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
31693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
3170f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
3171f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3172836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.zoom = 0;
3173836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, k.mParameters.zoom);
31743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
3175f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3176cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
31773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
31783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
3179f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
3181f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
3182f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
3183f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
31846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                (NUM_ZOOM_STEPS-1);
3185f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
31866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
3187f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
3188f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
3189f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
3190f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
3191f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
31923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
3193f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
3194f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
31953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
31963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
31973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
31983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
3199f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
32003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
3201f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
3202f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
32033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
32048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            mDeviceInfo->maxFaces);
32053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
3206f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
3207f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
32083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
320978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
3210f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
32113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
32123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
3213f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
32143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
32153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
3216f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
32173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
32183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
32193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
3220cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
32213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
32223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
3223f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3224f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
32253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
32263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::TRUE);
3227f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
32283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
32293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FALSE);
3230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
3231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
323236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Set up initial state for non-Camera.Parameters state variables
323336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
3234836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.storeMetadataInBuffers = true;
323536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    k.mParameters.playShutterSound = true;
32368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    k.mParameters.enableFaceDetect = false;
3237228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3238228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    k.mParameters.enableFocusMoveMessages = false;
3239174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    k.mParameters.afTriggerCounter = 0;
3240174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    k.mParameters.currentAfTriggerId = -1;
324178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
3242228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    k.mParameters.previewCallbackFlags = 0;
3243228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3244228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    k.mParameters.state = STOPPED;
3245228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3246836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    k.mParameters.paramsFlattened = params.flatten();
32473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
3248f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
3249f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
325061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
32518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Client::updateRequests(const Parameters &params) {
32528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
32538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
32548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updatePreviewRequest(params);
32558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
32568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
32578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
32588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
32598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
32608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateCaptureRequest(params);
32618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
32628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)",
32638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
32648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
32658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
32668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
32678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateRecordingRequest(params);
32688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
32698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
32708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
32718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
32728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
32738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
3274228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.state == PREVIEW) {
32758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mPreviewRequest);
32768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
32778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
32788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
32798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
32808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
3281228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else if (params.state == RECORD || params.state == VIDEO_SNAPSHOT) {
32828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mRecordingRequest);
32838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
32848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
32858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
32868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
32878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
32888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
32898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
32908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
32918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
3292836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters &params) {
3293be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
3294be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
3295836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
3296be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3297be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Check if stream parameters have to change
3298be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t currentWidth, currentHeight;
3299be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->getStreamInfo(mPreviewStreamId,
3300be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &currentWidth, &currentHeight, 0);
3301be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
3302be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying preview stream info: "
3303be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
3304be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
3305be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
3306836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
3307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight) {
33089e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
33099e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
3310836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    params.previewWidth, params.previewHeight);
3311be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->waitUntilDrained();
3312be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
3313be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
3314be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
3315be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
3316be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
3317be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->deleteStream(mPreviewStreamId);
3318be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
3319be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
3320be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
3321be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        strerror(-res), res);
3322be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
3323be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
3324be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mPreviewStreamId = NO_STREAM;
3325be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
3326be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3327be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3328be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
3329be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mPreviewWindow,
3330836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth, params.previewHeight,
3331be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
3332be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mPreviewStreamId);
3333be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
3334be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
3335be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
3336be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
3337be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
3338be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3339be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3340c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = mDevice->setStreamTransform(mPreviewStreamId,
3341836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.previewTransform);
3342c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
3343c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
3344c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
3345c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return res;
3346c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
3347c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
3348be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
3349be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
3350be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3351836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters &params) {
3352a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
33536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
3354cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
33556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
33566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
33576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
33586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
33596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
33606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
33616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
33626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3363be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3364cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mPreviewRequest, params);
3365be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
3366be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of preview "
3367be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
3368be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
3369be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
3370be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3371be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
33726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
33736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
33746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3375228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::updateCallbackStream(const Parameters &params) {
3376228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
3377228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3378228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackConsumer == 0) {
3379228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Create CPU buffer queue endpoint
3380228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer = new CpuConsumer(kCallbackHeapCount);
3381228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackWaiter = new CallbackWaiter(this);
3382228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer->setFrameAvailableListener(mCallbackWaiter);
3383228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer->setName(String8("Camera2Client::CallbackConsumer"));
3384228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackWindow = new SurfaceTextureClient(
3385228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->getProducerInterface());
3386228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
3387228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3388228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackStreamId != NO_STREAM) {
3389228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Check if stream parameters have to change
3390228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint32_t currentWidth, currentHeight, currentFormat;
3391228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = mDevice->getStreamInfo(mCallbackStreamId,
3392228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                &currentWidth, &currentHeight, &currentFormat);
3393228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
3394228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying callback output stream info: "
3395228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
3396228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
3397228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
3398228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
3399228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight ||
3400228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                currentFormat != (uint32_t)params.previewFormat) {
3401228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // Since size should only change while preview is not running,
3402228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // assuming that all existing use of old callback stream is
3403228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // completed.
3404228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = mDevice->deleteStream(mCallbackStreamId);
3405228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (res != OK) {
3406228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
3407228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        "for callbacks: %s (%d)", __FUNCTION__, mCameraId,
3408228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        strerror(-res), res);
3409228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                return res;
3410228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
3411228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackStreamId = NO_STREAM;
3412228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
3413228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
3414228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3415228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackStreamId == NO_STREAM) {
3416228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("Creating callback stream: %d %d format 0x%x",
3417228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewWidth, params.previewHeight,
3418228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewFormat);
3419228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = mDevice->createStream(mCallbackWindow,
3420228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewWidth, params.previewHeight,
3421228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewFormat, 0, &mCallbackStreamId);
3422228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
3423228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for callbacks: "
3424228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
3425228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
3426228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
3427228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
3428228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3429228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    return OK;
3430228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
3431228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3432228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3433836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureStream(const Parameters &params) {
3434be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
3435d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
3436d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Find out buffer size for JPEG
3437cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t maxJpegSize =
3438d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            staticInfo(ANDROID_JPEG_MAX_SIZE);
3439d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (maxJpegSize.count == 0) {
3440d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
3441d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
3442d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return INVALID_OPERATION;
3443d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
3444d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
3445d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureConsumer == 0) {
3446d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create CPU buffer queue endpoint
3447d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer = new CpuConsumer(1);
3448d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
3449d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
3450d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureWindow = new SurfaceTextureClient(
3451d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->getProducerInterface());
3452d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create memory for API consumption
34539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1,
34549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                       "Camera2Client::CaptureHeap");
34559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (mCaptureHeap->mHeap->getSize() == 0) {
3456d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to allocate memory for capture",
3457d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
3458d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return NO_MEMORY;
3459d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
3460d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
3461d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
3462be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
3463d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Check if stream parameters have to change
3464d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t currentWidth, currentHeight;
3465d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->getStreamInfo(mCaptureStreamId,
3466d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &currentWidth, &currentHeight, 0);
3467d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
3468d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying capture output stream info: "
3469d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
3470d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
3471d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
3472836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.pictureWidth ||
3473836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.pictureHeight) {
3474d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            res = mDevice->deleteStream(mCaptureStreamId);
3475d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (res != OK) {
3476d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
3477d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        "for capture: %s (%d)", __FUNCTION__, mCameraId,
3478d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        strerror(-res), res);
3479d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                return res;
3480d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
3481d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureStreamId = NO_STREAM;
3482d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
3483d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
3484be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3485be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId == NO_STREAM) {
3486be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Create stream for HAL production
3487be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mCaptureWindow,
3488836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.pictureWidth, params.pictureHeight,
3489be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
3490be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mCaptureStreamId);
3491be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
3492be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for capture: "
3493be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
3494be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
3495be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
3496be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3497be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3498d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
3499d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
3500be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3501836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest(const Parameters &params) {
3502d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
3503d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
3504cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
3505d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
3506d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &mCaptureRequest);
3507d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
3508d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
3509d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
3510d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
3511d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
3512d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
3513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3514cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mCaptureRequest, params);
3515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
3516be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
3517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
3518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
3519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
3520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3521be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3522cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE,
3523836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.jpegThumbSize, 2);
3524be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3525cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY,
3526836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegThumbQuality, 1);
3527be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3528cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_QUALITY,
3529836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegQuality, 1);
3530be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3531cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(
3532be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
3533836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegRotation, 1);
3534be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3535be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3536836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.gpsEnabled) {
3537cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
3538be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
3539836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.gpsCoordinates, 3);
3540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
3541cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
3542be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
3543836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.gpsTimestamp, 1);
3544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
3545cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
3546be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
3547cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                params.gpsProcessingMethod);
3548be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
3549be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
3550cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES);
3551be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
3552cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP);
3553be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
3554cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
3555be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
3556be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3557be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3558d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
3559d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
3560d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
3561836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters &params) {
35629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
35639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
3564cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
35659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
35669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &mRecordingRequest);
35679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
35689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default recording request:"
35699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
35709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
35719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
35729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
35739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3574cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mRecordingRequest, params);
35759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
35769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of recording "
35779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
35789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
35799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
35809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
35819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
35829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
35839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
35849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3585836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters &params) {
35869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
35879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
35889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingConsumer == 0) {
3589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Create CPU buffer queue endpoint. We need one more buffer here so that we can
3590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // always acquire and free a buffer when the heap is full; otherwise the consumer
3591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // will have buffers in flight we'll never clear out.
359230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingConsumer = new BufferItemConsumer(
359330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                GRALLOC_USAGE_HW_VIDEO_ENCODER,
359430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingHeapCount + 1,
359530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                true);
35969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
35979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
35989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingWindow = new SurfaceTextureClient(
35999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->getProducerInterface());
36009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Allocate memory later, since we don't know buffer size until receipt
36019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
36029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
36039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
36049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Check if stream parameters have to change
36059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint32_t currentWidth, currentHeight;
36069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->getStreamInfo(mRecordingStreamId,
36079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &currentWidth, &currentHeight, 0);
36089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
36099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying recording output stream info: "
36109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
36119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
36129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
3613836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.videoWidth ||
3614836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.videoHeight) {
36159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Should wait to be sure previous recording has finished
36169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = mDevice->deleteStream(mRecordingStreamId);
36179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) {
36189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
36199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
36209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        strerror(-res), res);
36219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return res;
36229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
36239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingStreamId = NO_STREAM;
36249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
36259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
36269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
36279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId == NO_STREAM) {
3628228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount = 0;
36299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createStream(mRecordingWindow,
3630836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.videoWidth, params.videoHeight,
363178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
36329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
36339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for recording: "
36349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
36359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
36369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
36379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
36389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
36399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
36409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
36419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3642cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(CameraMetadata *request,
3643836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        const Parameters &params) {
3644be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
3645be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
3646cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
3647cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            params.previewFpsRange, 2);
3648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3650836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t wbMode = params.autoWhiteBalanceLock ?
3651cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            (uint8_t)ANDROID_CONTROL_AWB_LOCKED : params.wbMode;
3652cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_MODE,
3653cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &wbMode, 1);
3654be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3655cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_EFFECT_MODE,
3656cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &params.effectMode, 1);
3657be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3658cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
3659836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.antibandingMode, 1);
3660be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3661be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3662be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t controlMode =
3663836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ?
3664be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE;
3665cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_MODE,
3666cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &controlMode, 1);
3667be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3668be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) {
3669cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_SCENE_MODE,
3670836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.sceneMode, 1);
3671be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
3672be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3673be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3674be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t flashMode = ANDROID_FLASH_OFF;
3675be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t aeMode;
3676836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.flashMode) {
3677be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
3678be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON; break;
3679be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
3680be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break;
3681be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_ON:
3682be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break;
3683be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
3684be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON;
3685be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            flashMode = ANDROID_FLASH_TORCH;
3686be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
3687be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
3688be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break;
3689be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
3690be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
3691836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.flashMode);
3692be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
3693be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3694836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED;
3695be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3696cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_FLASH_MODE,
3697cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &flashMode, 1);
3698be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3699cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_MODE,
3700cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &aeMode, 1);
3701be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3702be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3703be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float focusDistance = 0; // infinity focus in diopters
3704be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t focusMode;
3705836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.focusMode) {
3706be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
3707be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
3708be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
3709be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
3710be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
3711836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            focusMode = params.focusMode;
3712be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
3713be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
3714be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
3715be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            focusMode = ANDROID_CONTROL_AF_OFF;
3716be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
3717be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
3718be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
3719836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.focusMode);
3720be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
3721be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3722cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_LENS_FOCUS_DISTANCE,
3723cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &focusDistance, 1);
3724be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3725cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_MODE,
3726cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &focusMode, 1);
3727be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3728be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3729836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t focusingAreasSize = params.focusingAreas.size() * 5;
3730be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *focusingAreas = new int32_t[focusingAreasSize];
3731be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < focusingAreasSize; i += 5) {
3732836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 0] = params.focusingAreas[i].left;
3733836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 1] = params.focusingAreas[i].top;
3734836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 2] = params.focusingAreas[i].right;
3735836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 3] = params.focusingAreas[i].bottom;
3736836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 4] = params.focusingAreas[i].weight;
3737be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3738cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_REGIONS,
3739cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            focusingAreas,focusingAreasSize);
3740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] focusingAreas;
3742be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3743cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_EXP_COMPENSATION,
3744836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.exposureCompensation, 1);
3745be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3746be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3747836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t meteringAreasSize = params.meteringAreas.size() * 5;
3748be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *meteringAreas = new int32_t[meteringAreasSize];
3749be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < meteringAreasSize; i += 5) {
3750836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 0] = params.meteringAreas[i].left;
3751836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 1] = params.meteringAreas[i].top;
3752836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 2] = params.meteringAreas[i].right;
3753836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 3] = params.meteringAreas[i].bottom;
3754836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 4] = params.meteringAreas[i].weight;
3755be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
3756cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_REGIONS,
3757cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            meteringAreas, meteringAreasSize);
3758be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3759be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3760cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_REGIONS,
3761cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            meteringAreas, meteringAreasSize);
3762be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3763be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] meteringAreas;
3764be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3765be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // Need to convert zoom index into a crop rectangle. The rectangle is
3766be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // chosen to maximize its area on the sensor
3767be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3768cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
3769be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM);
3770be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
3771be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            (NUM_ZOOM_STEPS-1);
3772836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    float zoomRatio = 1 + zoomIncrement * params.zoom;
3773be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3774be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
3775836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.previewWidth >= params.previewHeight) {
37768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        zoomWidth =  mDeviceInfo->arrayWidth / zoomRatio;
3777be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = zoomWidth *
3778836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewHeight / params.previewWidth;
3779be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
37808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        zoomHeight = mDeviceInfo->arrayHeight / zoomRatio;
3781be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth = zoomHeight *
3782836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth / params.previewHeight;
3783be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
37848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    zoomLeft = (mDeviceInfo->arrayWidth - zoomWidth) / 2;
37858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    zoomTop = (mDeviceInfo->arrayHeight - zoomHeight) / 2;
3786be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3787be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
3788cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_SCALER_CROP_REGION,
3789cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            cropRegion, 3);
3790be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3791be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3792be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // TODO: Decide how to map recordingHint, or whether just to ignore it
3793be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
3794836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t vstabMode = params.videoStabilization ?
3795be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_ON :
3796be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
3797cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
3798be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &vstabMode, 1);
3799be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
3800be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
38018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    uint8_t faceDetectMode = params.enableFaceDetect ?
38028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            mDeviceInfo->bestFaceDetectMode :
38038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            (uint8_t)ANDROID_STATS_FACE_DETECTION_OFF;
3804cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_STATS_FACE_DETECT_MODE,
38058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            &faceDetectMode, 1);
38068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) return res;
38078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
3808be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
3809be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
3810be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
38118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalaint Camera2Client::arrayXToNormalized(int width) const {
38128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return width * 2000 / (mDeviceInfo->arrayWidth - 1) - 1000;
38138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
38148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
38158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalaint Camera2Client::arrayYToNormalized(int height) const {
38168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return height * 2000 / (mDeviceInfo->arrayHeight - 1) - 1000;
38178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
38188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
38196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) {
38206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
38216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
38226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
38236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
38246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
38256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
38266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
38276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
38286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YV12 :         // YV12
38296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
38306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
38316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
38326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
38336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
38346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
38356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
38366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
38376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
38383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) {
38393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    const char *fmt;
38403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    switch(format) {
38413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
38423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
38433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
38443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
38453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
38463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
38473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
38483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
38493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
38503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
38513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
38523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
38533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
38543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
38553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
38563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
38573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
38583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
38593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
38603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
38613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
38623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
38633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        default:
38643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
38653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    __FUNCTION__,  format);
38663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = NULL;
38673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
38683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
38693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return fmt;
38703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
38716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
38726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) {
38736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
38746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
38756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_AUTO :
38766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
38776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_INCANDESCENT :
38786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
38796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_FLUORESCENT :
38806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
38816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
38826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
38836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_DAYLIGHT :
38846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
38856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
38866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
38876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_TWILIGHT :
38886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
38896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_SHADE :
38906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
38916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
38926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
38936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) {
38946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
38956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
38966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_OFF :
38976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
38986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_MONO :
38996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
39006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_NEGATIVE :
39016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
39026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SOLARIZE :
39036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
39046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SEPIA :
39056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
39066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_POSTERIZE :
39076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
39086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_WHITEBOARD :
39096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
39106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_BLACKBOARD :
39116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
39126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_AQUA :
39136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
39146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
39156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
39166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) {
39176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
39186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
39196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
39206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
39216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_OFF :
39226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
39236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
39246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
39256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
39266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
39276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
39286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
39296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
39306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
39316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
39326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
39336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
39346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
39356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
39366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
39376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
39386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
39396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
39406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
39416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
39426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
39436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
39446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
39456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
39466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
39476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
39486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
39496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
39506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
39516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
39526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
39536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
39546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
39556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
39566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
39576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
39586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
39596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
39606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
39616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
39626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
39636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
39646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
39656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
39666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
39676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *flashMode) {
39686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
39696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
39706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
39716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
39726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
39736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
39746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
39756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
39766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
39776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
39786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
39796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
39806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
39816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
39826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
39836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *focusMode) {
39846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
39856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
39866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
39876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
39886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
39896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
39906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
39916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
39926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
39936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
39946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
39956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
39966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
39976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
39986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
39996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
40006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
40016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
40026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr,
40036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
40046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
40056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    areas->clear();
40066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areasCStr == NULL) {
40076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
40086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push();
40096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return OK;
40106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
40116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 areasStr(areasCStr);
40126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
40136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    while (areaStart != 0) {
40146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
40156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *numEnd;
40166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        int vals[NUM_FIELDS];
40176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
40186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            errno = 0;
40196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
40206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
40216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            area = numEnd + 1;
40226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
40236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push(Parameters::Area(
40246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
40256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
40266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
40276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
40286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
40296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
40306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
40316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                                      size_t maxRegions) {
40326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Definition of valid area can be found in
40336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // include/camera/CameraParameters.h
40346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
40356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 1) {
40366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (areas[0].left == 0 &&
40376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].top == 0 &&
40386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].right == 0 &&
40396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].bottom == 0 &&
40406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].weight == 0) {
40416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
40426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return OK;
40436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
40446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
40456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() > maxRegions) {
40466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Too many areas requested: %d",
40476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, areas.size());
40486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
40496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
40506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
40516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
40526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala         a != areas.end(); a++) {
40536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
40546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
40556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
40566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
40576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
40586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
40596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
40606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
40616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
40626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
40636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
40646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) {
40656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return !boolStr ? false :
40666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
40676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        false;
40686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
40696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
4070c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalaint Camera2Client::degToTransform(int degrees, bool mirror) {
4071c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (!mirror) {
4072c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (degrees == 0) return 0;
4073c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
4074c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
4075c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
4076c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    } else {  // Do mirror (horizontal flip)
4077c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (degrees == 0) {           // FLIP_H and ROT_0
4078c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H;
4079c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 90) {   // FLIP_H and ROT_90
4080c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
4081c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 180) {  // FLIP_H and ROT_180
4082c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V;
4083c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 270) {  // FLIP_H and ROT_270
4084c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
4085c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
4086c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
4087c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
4088c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return -1;
4089c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
40906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
4091228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
4092228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
4093228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
4094228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
4095228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
4096228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
4097228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
4098228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
4099228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
4100228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
4101228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
4102228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0x10;
4103228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
4104228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
4105228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
4106228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
4107228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
4108228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
4109228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
4110228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
4111228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
4112228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
4113228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
4114228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
4115228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
4116228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
4117228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
41188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
411961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
4120