Camera2Client.cpp revision 3cca136b73b0f4d058019230eb2070cc23e2bbb0
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);
107611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
108611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
10961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
11061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
11261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
114a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    stopPreview();
1186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId != NO_PREVIEW_STREAM) {
1206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
1216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mPreviewStreamId = NO_PREVIEW_STREAM;
1226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
123f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
12461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
12561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
12661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
128a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
12961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
13061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
133a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
13461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
13561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
138a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
13961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
14061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
1436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
144a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == PREVIEW) return INVALID_OPERATION;
1466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
1486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
1496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
1506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
1516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
1526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return setPreviewWindow(binder,window);
15561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
15661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
1586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
159a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == PREVIEW) return INVALID_OPERATION;
1616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
1636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
1646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
1656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
1666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
1676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return setPreviewWindow(binder, window);
1696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
1706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindow(const sp<IBinder>& binder,
1726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ANativeWindow>& window) {
173a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
1756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
1776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
1786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId != NO_PREVIEW_STREAM) {
1816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
1826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
1836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
1846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
1856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->createStream(window,
1873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.previewWidth, mParameters.previewHeight,
1883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CAMERA2_HAL_PIXEL_FORMAT_OPAQUE,
1896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &mPreviewStreamId);
1906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
1916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
1956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return startPreview();
1966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
19961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
20061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
20161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
202a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
20361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
20461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
20561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
206a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
2086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == PREVIEW) return INVALID_OPERATION;
2096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId == NO_PREVIEW_STREAM) {
2116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = WAITING_FOR_PREVIEW_WINDOW;
2126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
2136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
2166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        updatePreviewRequest();
2176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint8_t outputStream = mPreviewStreamId;
2206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera_metadata_entry_t outputStreams;
2226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = find_camera_metadata_entry(mPreviewRequest,
2236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
2246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &outputStreams);
2256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
2266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = add_camera_metadata_entry(mPreviewRequest,
2276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
2286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &outputStream, 1);
2296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    } else if (res == OK) {
2306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = update_camera_metadata_entry(mPreviewRequest,
2316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                outputStreams.index, &outputStream, 1, NULL);
2326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
2356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
2366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
2376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = STOPPED;
2386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
2396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
2426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
2436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: %s (%d)",
2446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
2456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = STOPPED;
2466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
2476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = PREVIEW;
2496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
25161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
25261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
25361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
254a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState != PREVIEW) return;
25661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mDevice->setStreamingRequest(NULL);
2586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
25961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
26061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
26161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
262a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mState == PREVIEW;
26461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
26561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
26661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
267a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
26861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
26961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
27061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
27161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
272a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
27361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
27461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
27561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
27661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
277a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
27861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
27961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
281a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
28261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
28361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
28461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
286a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
28761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
28861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
290a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
29261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
29361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
295a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
29761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
29861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
300a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
30161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
30261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
30361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
30461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
305a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
30761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
308f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
30961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
310a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
3123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return mParamsFlattened;
31361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
31461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
31561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
316a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
31861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
31961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
3213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
3223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
3233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        size_t minCount, size_t maxCount) {
3243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    status_t res;
3253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t entry;
3263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
3273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            tag,
3283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            &entry);
3293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
3303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
3313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
3323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
3333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
3343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
3353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
3363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, strerror(-res), res);
3373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
3383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
3393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else if (CC_UNLIKELY(
3403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
3413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
3423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
3433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
3443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
3453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
3463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
3473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
3483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
3493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
3503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
3513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
3523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
3533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return entry;
3543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
3553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
3563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
3573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
358f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
359f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
360a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
3623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    CameraParameters params;
363f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableProcessedSizes =
3653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
3663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
367f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
368f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
3693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewWidth = availableProcessedSizes.data.i32[0];
3703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewHeight = availableProcessedSizes.data.i32[1];
3713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.videoWidth = mParameters.previewWidth;
3723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.videoHeight = mParameters.previewHeight;
3733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
3743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
3753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
3763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
3773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%dx%d",
3783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewWidth, mParameters.previewHeight));
379f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
380f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
386f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
3873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
388f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
3893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFpsRanges =
3943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
3953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
396f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFpsRangeMin = availableFpsRanges.data.i32[0];
3983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFpsRangeMax = availableFpsRanges.data.i32[1];
399f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
4003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
4013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%d,%d",
4023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewFpsRangeMin,
4033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewFpsRangeMax));
404f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
405f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
409f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
410f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
412f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
4133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
415f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
416f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
4173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
4183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
4193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            formatEnumToString(mParameters.previewFormat)); // NV21
4203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
4213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFormats =
4223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
423f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
424f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
425f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
428f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
429f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
430f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
431f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
432f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv422sp";
433f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv420sp";
436f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
437f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
438f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv422i-yuyv";
439f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
440f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
441f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv420p";
442f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
443f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
444f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "rgb565";
445f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
446f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
447f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
449f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
450f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
451f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
452f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
453f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
456f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
4573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
458f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
459f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
461f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
462f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
463f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
4643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
4653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.previewFpsRangeMin);
466f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
467f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
468f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
469f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
470f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
471f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
472f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
473f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
4743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
475f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
476f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
477f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
4783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegSizes =
4793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
4803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
481f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
482f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
4833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.pictureWidth = availableJpegSizes.data.i32[0];
4843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.pictureHeight = availableJpegSizes.data.i32[1];
485f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
4863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureSize(mParameters.pictureWidth,
4873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.pictureHeight);
488f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
489f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
490f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
491f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
492f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
493f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
494f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
495f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
496f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
4973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
498f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
499f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
500f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
5023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
5033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
504f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegThumbnailSizes =
5063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
5073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
508f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
509f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
5103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
5113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
512f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
5143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbWidth);
5153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
5163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbHeight);
517f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
518f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
519f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
520f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
521f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
522f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
523f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
524f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
525f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
5263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
528f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
529f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbQuality = 90;
5313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
5323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbQuality);
5333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegQuality = 90;
5343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
5353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegQuality);
5363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegRotation = 0;
5373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
5383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegRotation);
5393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
5403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.gpsEnabled = false;
5413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.gpsProcessingMethod = "unknown";
5423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
5433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
5443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
5453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
5463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
5473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
5483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableWhiteBalanceModes =
5493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
554f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
558f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "auto";
559f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
560f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "incandescent";
562f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
564f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "fluorescent";
565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
566f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "warm-fluorescent";
568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "daylight";
571f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "cloudy-daylight";
574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
576f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "twilight";
577f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
578f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "shade";
580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
586f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
589f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
592f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
5933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
5983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
5993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
6003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
6013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableEffects =
6023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
6033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
606f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
607f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
608f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
609f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
610f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
611f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
612f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "none";
613f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
614f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "mono";
616f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
617f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "negative";
618f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
619f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
620f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "solarize";
621f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
622f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "sepia";
624f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "posterize";
627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
628f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
629f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "whiteboard";
630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
632f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "blackboard";
633f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "aqua";
636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
6443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
6483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
6493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
6503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
6513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAntibandingModes =
6523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
6533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "off";
663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "50hz";
666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "60hz";
669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "auto";
672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
677f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
6813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
682f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.sceneMode = ANDROID_CONTROL_OFF;
6863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
6873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
6883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
6893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableSceneModes =
6903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
6913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedSceneModes("auto");
694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
697f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "action";
709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "portrait";
712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "landscape";
715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "night";
718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
719f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "night-portrait";
721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "theatre";
724f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "beach";
727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "snow";
730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "sunset";
733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
734f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
735f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "steadyphoto";
736f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
737f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
738f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "fireworks";
739f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
740f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
741f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "sports";
742f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
743f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
744f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "party";
745f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
747f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "candlelight";
748f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
749f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "barcode";
751f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]);
755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
7603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
762f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t flashAvailable =
7663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
7673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAeModes =
7703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
7713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
773f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
7743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
7753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
7763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_AUTO);
7773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
7783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
7793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
7803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
7813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
7823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
784f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
785f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
7863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
7873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
789f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
790f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
7913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
7933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else {
7943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.flashMode = Parameters::FLASH_MODE_OFF;
7953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
7963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
7973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
7983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
800f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
8013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t minFocusDistance =
8023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
8033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
8043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
8053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAfModes =
8063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
8073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
8083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
809f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
810f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
8113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
8123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
8133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
8143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
8153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
8173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
8183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
8193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
8203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
8213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFocusModes = supportedFocusModes + "," +
8223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FOCUS_MODE_INFINITY;
823f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
824f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
828f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
829f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "auto";
830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
831f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
832f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "macro";
833f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
834f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
835f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "continuous-video";
836f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
837f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
838f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "continuous-picture";
839f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
840f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
841f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "edof";
842f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
843f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not supported in v1 API
844f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
846f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
847f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
849f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
850f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
851f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
852f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
8543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
856f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
8583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t max3aRegions =
8593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
8603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
8623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
8643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
865f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
8663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.focusingAreas.clear();
8673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
8683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
8693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFocalLengths =
8703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
8713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
872f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
873f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
8743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
8763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t sensorSize =
8773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
8783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
881f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
883f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
884f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
8853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
8863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
887f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
8883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.exposureCompensation = 0;
8893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
8903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                mParameters.exposureCompensation);
891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
8923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
8933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
8943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
8953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
8963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
8983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
899f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationStep =
9023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
9033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
9043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
9053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
906f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].numerator /
907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
908f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.autoExposureLock = false;
9103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
9113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
9123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
9133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
914f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.autoWhiteBalanceLock = false;
9163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
9173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
9183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
9193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
9223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
9243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.zoom = 0;
9283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
9293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
9323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
9333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
934f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
935f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
937f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
938f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
9396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                (NUM_ZOOM_STEPS-1);
940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
9416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
942f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
943f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
945f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
946f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
9473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
949f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
9513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
9523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
9533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
957f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxFacesDetected =
9593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
9603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
961f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            maxFacesDetected.data.i32[0]);
9623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
963f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
964f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
9663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP));
967f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
9693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
970f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
9723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
973f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
9753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
9763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
9773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
9783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
9793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
980f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
981f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
9823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
9833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::TRUE);
984f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
9853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
9863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FALSE);
987f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
988f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParamsFlattened = params.flatten();
9903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
991f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
992f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
99361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
9946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest() {
995a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
9976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
9986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
9996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
10006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
10016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
10026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
10036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
10046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
10056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Adjust for params changes
10076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
10086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
10096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) {
10113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    const char *fmt;
10123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    switch(format) {
10133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
10143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
10153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
10163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
10173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
10183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
10193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
10203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
10213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
10223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
10233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
10243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
10253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
10263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
10273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
10283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
10293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
10303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
10313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
10323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
10333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
10343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
10353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        default:
10363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
10373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    __FUNCTION__,  format);
10383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = NULL;
10393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
10403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
10413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return fmt;
10423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
104361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
1044