Camera2Client.cpp revision 6db981c45a964f0d9df4c3451f064dff7954d78e
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"
1861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
19f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Log.h>
2061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <cutils/properties.h>
2261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/SurfaceTextureClient.h>
2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h>
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
25f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <math.h>
26f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Client.h"
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#define ALOG1_ENTRY        \
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    int callingPid = getCallingPid(); \
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    ALOG1("%s: E (pid %d, id %d) ", __FUNCTION__, \
37f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            callingPid, mCameraId)
38f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
39f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#define ALOG1_EXIT        \
40f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    ALOG1("%s: X (pid %d, id %d) ", __FUNCTION__, \
41f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            callingPid, mCameraId)
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingUid() {
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingUid();
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
5461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
5561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
5761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int clientPid):
5861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        Client(cameraService, cameraClient,
59f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                cameraId, cameraFacing, clientPid),
606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState(NOT_INITIALIZED),
616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mParams(NULL),
626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mPreviewStreamId(NO_PREVIEW_STREAM),
636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mPreviewRequest(NULL)
64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
6561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    ALOG1_ENTRY;
6661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    ALOG1_EXIT;
70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    ALOG1_ENTRY;
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = buildDefaultParameters();
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->dump();
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    ALOG1_EXIT;
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
10061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
10161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
10261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mParams) delete mParams;
106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
10861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
10961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
111611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
112611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d:\n",
113611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
114611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
115611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
116611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
117611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
11861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
11961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
12161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
123f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    stopPreview();
1276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId != NO_PREVIEW_STREAM) {
1296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
1306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mPreviewStreamId = NO_PREVIEW_STREAM;
1316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
132f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
13361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
13461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
13761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
13861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
14161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
14261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
14561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
14661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
1496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
1506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOG1_ENTRY;
1516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == PREVIEW) return INVALID_OPERATION;
1526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
1546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
1556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
1566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
1576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
1586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return setPreviewWindow(binder,window);
16161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
16261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
1646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
1656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOG1_ENTRY;
1666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == PREVIEW) return INVALID_OPERATION;
1676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
1696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
1706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
1716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
1726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
1736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return setPreviewWindow(binder, window);
1756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
1766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindow(const sp<IBinder>& binder,
1786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ANativeWindow>& window) {
1796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOG1_ENTRY;
1806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
1816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
1836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
1846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId != NO_PREVIEW_STREAM) {
1876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
1886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
1896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
1906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
1916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int previewWidth, previewHeight;
1946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mParams->getPreviewSize(&previewWidth, &previewHeight);
1956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->createStream(window,
1976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            previewWidth, previewHeight, CAMERA2_HAL_PIXEL_FORMAT_OPAQUE,
1986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &mPreviewStreamId);
1996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
2006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
2016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
2046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return startPreview();
2056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOG1_EXIT;
2086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
20961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
21061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
21161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
21261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
21361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
21461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
21561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
2166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOG1_ENTRY;
2176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
2186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == PREVIEW) return INVALID_OPERATION;
2196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId == NO_PREVIEW_STREAM) {
2216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = WAITING_FOR_PREVIEW_WINDOW;
2226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
2236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
2266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        updatePreviewRequest();
2276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint8_t outputStream = mPreviewStreamId;
2306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera_metadata_entry_t outputStreams;
2326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = find_camera_metadata_entry(mPreviewRequest,
2336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
2346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &outputStreams);
2356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
2366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = add_camera_metadata_entry(mPreviewRequest,
2376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
2386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &outputStream, 1);
2396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    } else if (res == OK) {
2406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = update_camera_metadata_entry(mPreviewRequest,
2416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                outputStreams.index, &outputStream, 1, NULL);
2426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
2456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
2466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
2476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = STOPPED;
2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
2496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
2526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
2536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: %s (%d)",
2546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
2556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = STOPPED;
2566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
2576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = PREVIEW;
2596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
26161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
26261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
26361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
2646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOG1_ENTRY;
2656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState != PREVIEW) return;
26661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mDevice->setStreamingRequest(NULL);
2686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
26961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
27061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
27161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
2726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mState == PREVIEW;
27361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
27461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
27561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
27661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
27761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
27861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
27961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
28061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
28161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
28261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
28461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
28561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
28761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
28861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
28961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
29161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
29361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
2956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
29661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
29761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
2996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
30061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
30161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
30261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
30361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
30461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
30561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
30661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
3076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
30861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
309f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
31061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
311f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return mParams->flatten();
31261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
31361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
31461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
3156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
31661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
31761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
318f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// private methods
319f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
320f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
321f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mParams) {
323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        delete mParams;
324f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
325f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams = new CameraParameters;
326f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
327f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableProcessedSizes;
328f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
329f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableProcessedSizes);
331f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
332f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableProcessedSizes.count < 2) {
333f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
335f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
337f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES));
338f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
339f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
340f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
342f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewWidth = availableProcessedSizes.data.i32[0];
343f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewHeight = availableProcessedSizes.data.i32[1];
344f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
345f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setPreviewSize(previewWidth, previewHeight);
346f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setVideoSize(previewWidth, previewHeight);
347f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
348f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            String8::format("%dx%d",previewWidth,previewHeight));
349f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
350f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
351f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
352f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
353f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
356f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
357f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
358f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
359f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
362f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
363f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableFpsRanges;
364f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
365f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
366f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableFpsRanges);
367f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
368f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableFpsRanges.count < 2) {
369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
370f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
371f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
372f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
373f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
375f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
376f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewFpsRangeMin = availableFpsRanges.data.i32[0];
378f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewFpsRangeMax = availableFpsRanges.data.i32[1];
379f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
380f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            String8::format("%d,%d", previewFpsRangeMin, previewFpsRangeMax));
382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
386f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
387f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
388f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
389f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
393f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
395f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREVIEW_FORMAT,
396f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "yuv420sp"); // NV21
397f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
398f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableFormats;
399f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
400f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_FORMATS,
401f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableFormats);
402f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
404f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
405f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
409f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
410f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv422sp";
411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
412f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
413f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv420sp";
414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
415f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
416f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv422i-yuyv";
417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
418f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
419f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv420p";
420f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
421f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
422f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "rgb565";
423f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
424f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
425f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
428f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
429f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
430f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
431f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
432f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
433f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
436f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
437f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
438f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
439f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
440f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
441f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
442f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
443f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            previewFpsRangeMin);
444f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
445f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
446f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
447f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
449f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
450f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
451f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
452f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
453f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
456f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableJpegSizes;
457f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
458f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
459f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableJpegSizes);
460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
461f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableJpegSizes.count < 2) {
462f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
463f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
464f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
465f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
466f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_SCALER_AVAILABLE_JPEG_SIZES));
467f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
468f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
469f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
470f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
471f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t pictureWidth = availableJpegSizes.data.i32[0];
472f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t pictureHeight = availableJpegSizes.data.i32[1];
473f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
474f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setPictureSize(pictureWidth, pictureHeight);
475f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
476f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
477f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
478f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
479f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
480f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
481f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
482f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
483f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
484f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
485f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
486f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
487f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
488f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setPictureFormat("jpeg");
489f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
490f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
491f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "jpeg");
492f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
493f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableJpegThumbnailSizes;
494f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
495f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
496f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableJpegThumbnailSizes);
497f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
498f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableJpegThumbnailSizes.count < 2) {
499f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
500f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
501f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
502f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
503f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES));
504f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
505f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
506f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
507f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
508f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
509f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
510f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
511f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
512f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            jpegThumbWidth);
513f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
514f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            jpegThumbHeight);
515f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
516f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
517f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
518f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
519f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
520f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
521f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
522f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
523f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
524f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
525f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
526f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
528f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
529f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "90");
530f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_QUALITY,
531f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "90");
532f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ROTATION,
533f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "0");
534f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // Not settting GPS fields
535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
536f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_WHITE_BALANCE,
537f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "auto");
538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableWhiteBalanceModes;
540f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
541f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AWB_AVAILABLE_MODES,
542f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableWhiteBalanceModes);
543f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
544f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
545f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
546f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
547f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
548f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
549f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "auto";
552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
554f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "incandescent";
555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "fluorescent";
558f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
559f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
560f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "warm-fluorescent";
561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
562f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "daylight";
564f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
566f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "cloudy-daylight";
567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "twilight";
570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
571f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "shade";
573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
576f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
577f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
578f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
586f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
589f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_EFFECT, "none");
591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableEffects;
592f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AVAILABLE_EFFECTS,
594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableEffects);
595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
598f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
601f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
602f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
603f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "none";
605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
606f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
607f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "mono";
608f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
609f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "negative";
610f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
611f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
612f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "solarize";
613f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
614f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "sepia";
616f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
617f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
618f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "posterize";
619f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
620f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
621f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "whiteboard";
622f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
624f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "blackboard";
625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "aqua";
628f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
629f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
632f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
633f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ANTIBANDING, "auto");
640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableAntibandingModes;
641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableAntibandingModes);
644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
647f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
649f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
650f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
653f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "off";
654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "50hz";
657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "60hz";
660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "auto";
663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_SCENE_MODE, "auto");
677f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableSceneModes;
678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableSceneModes);
681f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
682f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedSceneModes("auto");
684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
686f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
687f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
697f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "action";
699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "portrait";
702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "landscape";
705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "night";
708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "night-portrait";
711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "theatre";
714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "beach";
717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
719f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "snow";
720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "sunset";
723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
724f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "steadyphoto";
726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "fireworks";
729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "sports";
732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
734f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "party";
735f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
736f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
737f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "candlelight";
738f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
739f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
740f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "barcode";
741f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
742f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
743f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
744f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]);
745f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
747f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
748f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
749f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mParams->set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
751f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t flashAvailable;
756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_FLASH_AVAILABLE, &flashAvailable);
758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableAeModes;
761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
762f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_AVAILABLE_MODES,
763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableAeModes);
764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
765f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_FLASH_MODE, "auto");
768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedFlashModes("off,auto,on,torch");
769f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
770f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes += ",red-eye";
773f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
774f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
776f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
777f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
778f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
780f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t minFocusDistance;
781f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
782f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &minFocusDistance);
784f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
785f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableAfModes;
786f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AF_AVAILABLE_MODES,
788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableAfModes);
789f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
790f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
791f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_FOCUS_MODE, "fixed");
793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, "fixed");
794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
795f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_FOCUS_MODE, "auto");
796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedFocusModes("fixed,infinity");
797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
800f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
801f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
802f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "auto";
804f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
805f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
806f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "macro";
807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
808f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
809f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "continuous-video";
810f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
811f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
812f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "continuous-picture";
813f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
814f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "edof";
816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not supported in v1 API
818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
823f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
824f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
828f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
829f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
831f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
832f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t max3aRegions;
833f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
834f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_MAX_REGIONS, &max3aRegions);
835f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
836f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
837f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
838f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
839f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_FOCUS_AREAS,
840f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
841f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
842f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableFocalLengths;
843f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
844f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableFocalLengths);
846f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
847f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
849f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
850f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t sensorSize;
851f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
852f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SENSOR_PHYSICAL_SIZE,
853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &sensorSize);
854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
856f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
860f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 0);
865f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange;
867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
868f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
869f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &exposureCompensationRange);
870f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
872f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
873f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
874f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
876f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationStep;
877f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &exposureCompensationStep);
880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
881f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].numerator /
883f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
884f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
885f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, "false");
886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true");
887f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, "false");
889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true");
890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_METERING_AREAS,
894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
895f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ZOOM, 0);
8976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
899f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom;
900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxDigitalZoom);
902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
903f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
904f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
905f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
906f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
9086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                (NUM_ZOOM_STEPS-1);
909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
9106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
913f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
914f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
915f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
918f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
919f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ZOOM_SUPPORTED, "true");
920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true");
921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_FOCUS_DISTANCES,
923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t maxFacesDetected;
926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_STATS_MAX_FACE_COUNT,
928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &maxFacesDetected);
929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            maxFacesDetected.data.i32[0]);
931f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
933f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
934f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
935f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "yuv420sp");
936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
937f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_RECORDING_HINT,
938f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "false");
939f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
941f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "true");
942f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
943f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION,
944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "false");
945f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
946f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes;
947f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
949f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableVideoStabilizationModes);
950f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
951f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "true");
954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "false");
957f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
958f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
960f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
96161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
9626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest() {
9636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOG1_ENTRY
9646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
9656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
9666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
9676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
9686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
9696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
9706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
9716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
9726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
9736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
9746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // TODO: Adjust for mParams changes
9756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOG1_EXIT
9766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
9776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
97961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
980