Camera2Client.cpp revision ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46
161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala/*
261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * you may not use this file except in compliance with the License.
661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * You may obtain a copy of the License at
761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
1061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * See the License for the specific language governing permissions and
1461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * limitations under the License.
1561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala */
1661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define LOG_TAG "Camera2Client"
18a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
20a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
21f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Log.h>
22a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#include <utils/Trace.h>
2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <cutils/properties.h>
2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/SurfaceTextureClient.h>
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h>
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <math.h>
29f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Client.h"
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingUid() {
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingUid();
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int clientPid):
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        Client(cameraService, cameraClient,
53f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                cameraId, cameraFacing, clientPid),
546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState(NOT_INITIALIZED),
556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mPreviewStreamId(NO_PREVIEW_STREAM),
566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mPreviewRequest(NULL)
57f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
58a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
63f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
65a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = buildDefaultParameters();
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGD("%s", mParamsFlattened.string());
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
9161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
9261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
9361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
94a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
9961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
10061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
10161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
102611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
103611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d:\n",
104611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
105611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
106611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mState) {
1117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(NOT_INITIALIZED)
1127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(STOPPED)
1137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(WAITING_FOR_PREVIEW_WINDOW)
1147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(PREVIEW)
1157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(RECORD)
1167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(STILL_CAPTURE)
1177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n"); break;
1187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  Current parameters:\n");
1217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
1227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.previewWidth, mParameters.previewHeight);
1237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
1247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.previewFpsRangeMin, mParameters.previewFpsRangeMax);
1257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
1267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.previewFormat);
1277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
1287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.pictureWidth, mParameters.pictureHeight);
1297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
1307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.jpegThumbWidth, mParameters.jpegThumbHeight);
1317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
1327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.jpegQuality, mParameters.jpegThumbQuality);
1337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", mParameters.jpegRotation);
1347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
1357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.gpsEnabled ? "enabled" : "disabled");
1367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    if (mParameters.gpsEnabled) {
1377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
1387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsLatitude, mParameters.gpsLongitude,
1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsAltitude);
1407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsTimestamp);
1427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
1437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsProcessingMethod.string());
1447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.wbMode) {
1487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
1507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
1527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
1537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
1547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
1567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
1607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.effectMode) {
1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
1637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
1647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.antibandingMode) {
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.sceneMode) {
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.flashMode) {
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.focusMode) {
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) {
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].left,
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].top,
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].right,
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].bottom,
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].weight);
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.exposureCompensation);
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.autoExposureLock ? "enabled" : "disabled",
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" );
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) {
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].left,
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].top,
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].right,
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].bottom,
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].weight);
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("   Zoom index: %d\n", mParameters.zoom);
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("   Video size: %d x %d\n", mParameters.videoWidth,
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.videoHeight);
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("   Recording hint is %s\n",
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.recordingHint ? "set" : "not set");
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("   Video stabilization is %s\n",
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.videoStabilization ? "enabled" : "disabled");
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
265611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    // TODO: Dump Camera2Device
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
270611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
27161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
27261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
27361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
27461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
27561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
276a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
277ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
278ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
279f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
280f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
281ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    stopPreviewLocked();
2826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId != NO_PREVIEW_STREAM) {
2846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
2856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mPreviewStreamId = NO_PREVIEW_STREAM;
2866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
287f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
28861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
28961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
29061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
292a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
293ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
294ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
29561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
29661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
29761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
299a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
300ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
301ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
30261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
30361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
30461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
30561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
306a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
307ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
308ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
30961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
31061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
31161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
3136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
314a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
315ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
316ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
317ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    if (mState >= PREVIEW) return INVALID_OPERATION;
3186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
3206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
3216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
3226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
3236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
3246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return setPreviewWindow(binder,window);
32761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
32861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
3306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
331a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
332ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
333ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
334ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    if (mState >= PREVIEW) return INVALID_OPERATION;
3356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
3376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
3386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
3396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
3406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
3416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return setPreviewWindow(binder, window);
3436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
3446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindow(const sp<IBinder>& binder,
3466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ANativeWindow>& window) {
347a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
3496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
3516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
3526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId != NO_PREVIEW_STREAM) {
3556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
3566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
3576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
3586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
3596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->createStream(window,
3613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.previewWidth, mParameters.previewHeight,
3623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CAMERA2_HAL_PIXEL_FORMAT_OPAQUE,
3636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &mPreviewStreamId);
3646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
3656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
3666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
3696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return startPreview();
3706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
37361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
37461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
37561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
376a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
377ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
37861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
37961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
381a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
382ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
383ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
3846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
3856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == PREVIEW) return INVALID_OPERATION;
3866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId == NO_PREVIEW_STREAM) {
3886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = WAITING_FOR_PREVIEW_WINDOW;
3896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
3906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
3936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        updatePreviewRequest();
3946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint8_t outputStream = mPreviewStreamId;
3976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera_metadata_entry_t outputStreams;
3996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = find_camera_metadata_entry(mPreviewRequest,
4006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
4016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &outputStreams);
4026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
4036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = add_camera_metadata_entry(mPreviewRequest,
4046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
4056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &outputStream, 1);
4066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    } else if (res == OK) {
4076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = update_camera_metadata_entry(mPreviewRequest,
4086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                outputStreams.index, &outputStream, 1, NULL);
4096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
4126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
4136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
4146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = STOPPED;
4156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
4166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
4196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
4206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: %s (%d)",
4216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
4226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = STOPPED;
4236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
4246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = PREVIEW;
4266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
42861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
42961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
43061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
431a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
432ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
433ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    stopPreviewLocked();
434ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
435ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
436ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvalavoid Camera2Client::stopPreviewLocked() {
437ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
4386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState != PREVIEW) return;
43961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mDevice->setStreamingRequest(NULL);
4416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
44261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
44461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
445a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
446ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mState == PREVIEW;
44861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
45061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
451a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
452ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
45361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
45461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
45561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
45661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
457a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
458ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
45961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
46061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
46161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
46261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
463a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
464ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
46561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
46661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
46761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
468a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
469ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
47061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
47161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
47261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
47361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
474a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
475ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
47661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
47761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
47861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
479a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
480ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
48261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
48361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
48461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
485a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
486ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
48861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
48961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
49061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
491a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
492ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
49361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
49461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
49561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
49661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
497a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
498ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
50061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
501f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
50261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
503a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
504ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
505ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
506ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
507ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
5083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
5093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return mParamsFlattened;
51061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
51161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
51261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
513a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
514ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
51661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
51761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
5193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
5203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
5213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        size_t minCount, size_t maxCount) {
5223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    status_t res;
5233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t entry;
5243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
5253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            tag,
5263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            &entry);
5273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
5283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
5293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
5303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
5313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
5323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
5333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
5343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, strerror(-res), res);
5353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
5363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
5373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else if (CC_UNLIKELY(
5383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
5393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
5403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
5413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
5423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
5433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
5443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
5453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
5463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
5473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
5483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
5493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
5503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
5513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return entry;
5523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
5533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
5543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
5553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
558a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
559ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
560ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
5623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    CameraParameters params;
563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableProcessedSizes =
5653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
5663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
5693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewWidth = availableProcessedSizes.data.i32[0];
5703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewHeight = availableProcessedSizes.data.i32[1];
5713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.videoWidth = mParameters.previewWidth;
5723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.videoHeight = mParameters.previewHeight;
5733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
5743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
5753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
5763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
5773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%dx%d",
5783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewWidth, mParameters.previewHeight));
579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
586f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
5873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
5893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
592f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFpsRanges =
5943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
5953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFpsRangeMin = availableFpsRanges.data.i32[0];
5983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFpsRangeMax = availableFpsRanges.data.i32[1];
599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
6013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%d,%d",
6023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewFpsRangeMin,
6033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewFpsRangeMax));
604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
606f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
607f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
608f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
609f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
610f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
611f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
612f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
6133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
614f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
616f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
6183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
6193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            formatEnumToString(mParameters.previewFormat)); // NV21
6203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
6213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFormats =
6223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
624f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
628f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
629f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
632f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv422sp";
633f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv420sp";
636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv422i-yuyv";
639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv420p";
642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "rgb565";
645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
647f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
649f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
650f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
653f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
6573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
6653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.previewFpsRangeMin);
666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
6743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
677f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegSizes =
6793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
6803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
681f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
682f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
6833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.pictureWidth = availableJpegSizes.data.i32[0];
6843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.pictureHeight = availableJpegSizes.data.i32[1];
685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureSize(mParameters.pictureWidth,
6873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.pictureHeight);
688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
6973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
7023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
7033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegThumbnailSizes =
7063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
7073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
7103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
7113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
7143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbWidth);
7153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
7163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbHeight);
717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
719f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
724f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
7263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbQuality = 90;
7313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
7323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbQuality);
7333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegQuality = 90;
7343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
7353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegQuality);
7363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegRotation = 0;
7373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
7383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegRotation);
7393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
7403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.gpsEnabled = false;
7413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.gpsProcessingMethod = "unknown";
7423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
7433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
7443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
7453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
7463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
7473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
7483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableWhiteBalanceModes =
7493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
751f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "auto";
759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "incandescent";
762f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "fluorescent";
765f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "warm-fluorescent";
768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
769f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
770f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "daylight";
771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
773f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "cloudy-daylight";
774f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
776f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "twilight";
777f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
778f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "shade";
780f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
781f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
782f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
784f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
785f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
786f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
789f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
790f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
791f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
7933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
795f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
7983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
7993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
8003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
8013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableEffects =
8023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
8033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
804f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
805f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
806f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
808f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
809f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
810f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
811f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
812f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "none";
813f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
814f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "mono";
816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "negative";
818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "solarize";
821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
823f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "sepia";
824f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "posterize";
827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
828f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
829f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "whiteboard";
830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
831f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
832f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "blackboard";
833f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
834f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
835f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "aqua";
836f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
837f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
838f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
839f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
840f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
841f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
842f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
843f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
8443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
846f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
8473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
8483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
8493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
8503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
8513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAntibandingModes =
8523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
8533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
856f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
860f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "off";
863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
865f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "50hz";
866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
868f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "60hz";
869f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
870f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "auto";
872f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
873f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
874f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
876f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
877f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
8813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
883f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
884f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
8853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.sceneMode = ANDROID_CONTROL_OFF;
8863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
8873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
8883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
8893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableSceneModes =
8903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
8913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedSceneModes("auto");
894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
895f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
899f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
903f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
904f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
905f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
906f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
908f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "action";
909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
910f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "portrait";
912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
913f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
914f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "landscape";
915f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "night";
918f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
919f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "night-portrait";
921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "theatre";
924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "beach";
927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "snow";
930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
931f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "sunset";
933f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
934f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
935f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "steadyphoto";
936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
937f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
938f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "fireworks";
939f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
941f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "sports";
942f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
943f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "party";
945f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
946f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
947f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "candlelight";
948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
949f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
950f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "barcode";
951f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]);
955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
957f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
958f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
9603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
961f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
962f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
963f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
964f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t flashAvailable =
9663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
9673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
968f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAeModes =
9703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
9713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
972f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
973f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
9743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
9753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
9763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_AUTO);
9773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
9783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
9793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
9803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
9813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
9823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
983f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
984f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
985f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
9863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
9873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
988f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
989f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
990f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
9913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
992f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
9933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else {
9943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.flashMode = Parameters::FLASH_MODE_OFF;
9953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
9963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
9973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
9983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
999f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1000f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
10013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t minFocusDistance =
10023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
10033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
10043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
10053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAfModes =
10063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
10073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
10083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1009f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
1010f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
10113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
10123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
10133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
10143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
10153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
1016f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
10173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
10183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
10193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
10203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
10213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFocusModes = supportedFocusModes + "," +
10223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FOCUS_MODE_INFINITY;
1023f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
1024f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
1025f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
1026f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1027f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
1028f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
1029f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "auto";
1030f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1031f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
1032f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "macro";
1033f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1034f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
1035f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "continuous-video";
1036f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1037f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
1038f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "continuous-picture";
1039f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1040f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
1041f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "edof";
1042f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1043f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not supported in v1 API
1044f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
1045f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1046f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1047f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1048f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
1049f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
1050f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1051f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1052f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1053f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
10543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1055f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
1056f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1057f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
10583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t max3aRegions =
10593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
10603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
1061f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
10623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
1063f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
10643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
1065f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
10663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.focusingAreas.clear();
10673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
10683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
10693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFocalLengths =
10703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
10713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
1072f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1073f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
10743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
1075f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
10763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t sensorSize =
10773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
10783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
1079f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1080f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
1081f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
1082f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
1083f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
1084f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
10853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
10863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
1087f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
10883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.exposureCompensation = 0;
10893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
10903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                mParameters.exposureCompensation);
1091f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
10923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
10933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
10943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
10953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
10963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
1097f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
10983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
1099f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
1100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationStep =
11023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
11033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
11043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
11053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
1106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].numerator /
1107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
1108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.autoExposureLock = false;
11103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
11113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
11123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
11133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.autoWhiteBalanceLock = false;
11163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
11173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
11183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
11193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
11223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
1123f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
11243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
1125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
1126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.zoom = 0;
11283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
11293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
1130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
11323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
11333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
1134f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1135f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
1137f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
1138f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
11396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                (NUM_ZOOM_STEPS-1);
1140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
11416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
1142f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
1143f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
1145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
1146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
11473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
1148f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1149f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
11513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
11523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
11533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1154f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
1156f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
1157f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxFacesDetected =
11593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
11603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
1161f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            maxFacesDetected.data.i32[0]);
11623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
1163f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
1164f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
11663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP));
1167f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
11693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
1170f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
11723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1173f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
11753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
11763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
11773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
11783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
11793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
1180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1181f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
11823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
11833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::TRUE);
1184f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
11853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
11863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FALSE);
1187f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1188f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParamsFlattened = params.flatten();
11903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1191f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
1192f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
119361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest() {
1195a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
11976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
11986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
11996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
12006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
12016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
12026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
12036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
12046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
12056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
12063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Adjust for params changes
12076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
12086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
12096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) {
12113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    const char *fmt;
12123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    switch(format) {
12133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
12143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
12153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
12163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
12173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
12183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
12193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
12203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
12213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
12223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
12233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
12243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
12253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
12263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
12273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
12283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
12293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
12303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
12313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
12323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
12333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
12343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
12353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        default:
12363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
12373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    __FUNCTION__,  format);
12383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = NULL;
12393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
12403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
12413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return fmt;
12423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
124361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
1244