Camera2Client.cpp revision a189097d0c96fac9afa86e644312ffbb0027b124
161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala/*
261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * you may not use this file except in compliance with the License.
661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * You may obtain a copy of the License at
761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
1061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * See the License for the specific language governing permissions and
1461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * limitations under the License.
1561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala */
1661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define LOG_TAG "Camera2Client"
18a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
20a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
21f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Log.h>
22a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#include <utils/Trace.h>
2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <cutils/properties.h>
2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/SurfaceTextureClient.h>
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h>
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <math.h>
29f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Client.h"
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingUid() {
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingUid();
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int clientPid):
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        Client(cameraService, cameraClient,
53f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                cameraId, cameraFacing, clientPid),
546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState(NOT_INITIALIZED),
556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mParams(NULL),
566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mPreviewStreamId(NO_PREVIEW_STREAM),
576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mPreviewRequest(NULL)
58f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
59a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
63f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
66a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = buildDefaultParameters();
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->dump();
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
9161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
9261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
9361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
94a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mParams) delete mParams;
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
10061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
10161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
10261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
103611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
104611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d:\n",
105611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
106611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
107611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
108611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
109611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
11061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
11161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
11361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
115a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    stopPreview();
1196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId != NO_PREVIEW_STREAM) {
1216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
1226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mPreviewStreamId = NO_PREVIEW_STREAM;
1236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
12561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
12661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
12761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
129a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
13061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
13161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
134a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
13561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
13661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
139a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
14061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
14161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
1446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
145a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == PREVIEW) return INVALID_OPERATION;
1476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
1496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
1506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
1516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
1526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
1536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return setPreviewWindow(binder,window);
15661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
15761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
1596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
160a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == PREVIEW) return INVALID_OPERATION;
1626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
1646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
1656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
1666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
1676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
1686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return setPreviewWindow(binder, window);
1706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
1716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindow(const sp<IBinder>& binder,
1736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ANativeWindow>& window) {
174a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
1766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
1786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
1796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId != NO_PREVIEW_STREAM) {
1826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
1836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
1846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
1856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
1866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int previewWidth, previewHeight;
1896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mParams->getPreviewSize(&previewWidth, &previewHeight);
1906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->createStream(window,
1926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            previewWidth, previewHeight, CAMERA2_HAL_PIXEL_FORMAT_OPAQUE,
1936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &mPreviewStreamId);
1946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
1956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
1996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return startPreview();
2006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
20361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
20461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
20561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
206a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
20761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
20861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
20961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
210a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
2126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == PREVIEW) return INVALID_OPERATION;
2136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewStreamId == NO_PREVIEW_STREAM) {
2156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = WAITING_FOR_PREVIEW_WINDOW;
2166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
2176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
2206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        updatePreviewRequest();
2216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint8_t outputStream = mPreviewStreamId;
2246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera_metadata_entry_t outputStreams;
2266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = find_camera_metadata_entry(mPreviewRequest,
2276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
2286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &outputStreams);
2296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
2306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = add_camera_metadata_entry(mPreviewRequest,
2316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
2326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &outputStream, 1);
2336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    } else if (res == OK) {
2346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = update_camera_metadata_entry(mPreviewRequest,
2356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                outputStreams.index, &outputStream, 1, NULL);
2366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
2396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
2406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
2416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = STOPPED;
2426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
2436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
2466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
2476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: %s (%d)",
2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
2496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = STOPPED;
2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
2516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = PREVIEW;
2536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
25561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
25661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
25761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
258a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState != PREVIEW) return;
26061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mDevice->setStreamingRequest(NULL);
2626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
26361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
26461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
26561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
266a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mState == PREVIEW;
26861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
26961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
27061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
271a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
27261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
27361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
27461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
27561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
276a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
27761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
27861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
27961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
281a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
28261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
28361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
285a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
28661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
28761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
28861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
290a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
29161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
29261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
294a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
2956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
29661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
29761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
299a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
30161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
30261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
30361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
304a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
30561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
30661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
30761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
30861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
309a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
31161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
31361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
314a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
315f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return mParams->flatten();
31661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
31761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
31861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
319a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
32161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
32261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// private methods
324f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
325f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
326a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
327f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
328f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mParams) {
329f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        delete mParams;
330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
331f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams = new CameraParameters;
332f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
333f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableProcessedSizes;
334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
335f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableProcessedSizes);
337f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
338f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableProcessedSizes.count < 2) {
339f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
340f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
342f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
343f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES));
344f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
345f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
346f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
347f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
348f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewWidth = availableProcessedSizes.data.i32[0];
349f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewHeight = availableProcessedSizes.data.i32[1];
350f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
351f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setPreviewSize(previewWidth, previewHeight);
352f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setVideoSize(previewWidth, previewHeight);
353f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            String8::format("%dx%d",previewWidth,previewHeight));
355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
356f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
357f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
358f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
359f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
362f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
363f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
364f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
365f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
366f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
367f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
368f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableFpsRanges;
370f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
371f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
372f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableFpsRanges);
373f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableFpsRanges.count < 2) {
375f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
376f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
378f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
379f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
380f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewFpsRangeMin = availableFpsRanges.data.i32[0];
384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewFpsRangeMax = availableFpsRanges.data.i32[1];
385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
386f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
387f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            String8::format("%d,%d", previewFpsRangeMin, previewFpsRangeMax));
388f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
389f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
393f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
395f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
396f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
397f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
398f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
399f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
400f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
401f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREVIEW_FORMAT,
402f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "yuv420sp"); // NV21
403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
404f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableFormats;
405f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_FORMATS,
407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableFormats);
408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
409f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
410f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
412f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
413f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
415f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
416f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv422sp";
417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
418f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
419f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv420sp";
420f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
421f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
422f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv422i-yuyv";
423f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
424f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
425f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv420p";
426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
428f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "rgb565";
429f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
430f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
431f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
432f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
433f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
436f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
437f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
438f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
439f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
440f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
441f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
442f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
443f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
444f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
445f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
446f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
447f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
449f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            previewFpsRangeMin);
450f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
451f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
452f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
453f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
456f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
457f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
458f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
459f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
461f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
462f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableJpegSizes;
463f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
464f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
465f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableJpegSizes);
466f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
467f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableJpegSizes.count < 2) {
468f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
469f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
470f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
471f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
472f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_SCALER_AVAILABLE_JPEG_SIZES));
473f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
474f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
475f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
476f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
477f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t pictureWidth = availableJpegSizes.data.i32[0];
478f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t pictureHeight = availableJpegSizes.data.i32[1];
479f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
480f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setPictureSize(pictureWidth, pictureHeight);
481f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
482f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
483f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
484f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
485f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
486f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
487f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
488f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
489f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
490f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
491f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
492f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
493f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
494f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setPictureFormat("jpeg");
495f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
496f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
497f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "jpeg");
498f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
499f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableJpegThumbnailSizes;
500f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
501f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
502f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableJpegThumbnailSizes);
503f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
504f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableJpegThumbnailSizes.count < 2) {
505f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
506f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
507f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
508f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
509f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES));
510f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
511f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
512f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
513f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
514f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
515f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
516f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
517f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
518f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            jpegThumbWidth);
519f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
520f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            jpegThumbHeight);
521f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
522f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
523f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
524f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
525f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
526f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
528f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
529f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
530f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
531f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
532f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
533f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
534f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "90");
536f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_QUALITY,
537f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "90");
538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ROTATION,
539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "0");
540f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // Not settting GPS fields
541f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
542f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_WHITE_BALANCE,
543f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "auto");
544f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
545f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableWhiteBalanceModes;
546f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
547f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AWB_AVAILABLE_MODES,
548f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableWhiteBalanceModes);
549f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
554f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "auto";
558f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
559f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
560f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "incandescent";
561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
562f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "fluorescent";
564f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
566f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "warm-fluorescent";
567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "daylight";
570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
571f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "cloudy-daylight";
573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "twilight";
576f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
577f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
578f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "shade";
579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
586f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
589f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
592f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_EFFECT, "none");
597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableEffects;
598f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AVAILABLE_EFFECTS,
600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableEffects);
601f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
602f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
603f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
606f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
607f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
608f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
609f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
610f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "none";
611f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
612f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
613f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "mono";
614f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "negative";
616f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
617f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
618f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "solarize";
619f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
620f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
621f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "sepia";
622f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
624f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "posterize";
625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "whiteboard";
628f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
629f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "blackboard";
631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
632f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
633f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "aqua";
634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ANTIBANDING, "auto");
646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableAntibandingModes;
647f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
649f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableAntibandingModes);
650f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
653f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "off";
660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "50hz";
663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "60hz";
666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "auto";
669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
677f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
681f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
682f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_SCENE_MODE, "auto");
683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableSceneModes;
684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
686f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableSceneModes);
687f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedSceneModes("auto");
690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
697f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "action";
705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "portrait";
708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "landscape";
711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "night";
714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "night-portrait";
717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
719f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "theatre";
720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "beach";
723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
724f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "snow";
726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "sunset";
729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "steadyphoto";
732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
734f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "fireworks";
735f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
736f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
737f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "sports";
738f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
739f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
740f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "party";
741f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
742f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
743f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "candlelight";
744f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
745f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "barcode";
747f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
748f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
749f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]);
751f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mParams->set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t flashAvailable;
762f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_FLASH_AVAILABLE, &flashAvailable);
764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
765f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableAeModes;
767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_AVAILABLE_MODES,
769f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableAeModes);
770f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
773f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_FLASH_MODE, "auto");
774f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedFlashModes("off,auto,on,torch");
775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
776f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
777f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
778f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes += ",red-eye";
779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
780f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
781f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
782f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
784f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
785f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
786f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t minFocusDistance;
787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
789f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &minFocusDistance);
790f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
791f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableAfModes;
792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AF_AVAILABLE_MODES,
794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableAfModes);
795f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_FOCUS_MODE, "fixed");
799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, "fixed");
800f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
801f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_FOCUS_MODE, "auto");
802f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedFocusModes("fixed,infinity");
803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
804f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
805f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
806f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
808f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
809f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "auto";
810f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
811f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
812f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "macro";
813f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
814f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "continuous-video";
816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "continuous-picture";
819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "edof";
822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
823f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not supported in v1 API
824f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
828f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
829f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
831f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
832f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
833f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
834f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
835f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
836f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
837f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
838f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t max3aRegions;
839f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
840f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_MAX_REGIONS, &max3aRegions);
841f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
842f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
843f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
844f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_FOCUS_AREAS,
846f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
847f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableFocalLengths;
849f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
850f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
851f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableFocalLengths);
852f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
856f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t sensorSize;
857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SENSOR_PHYSICAL_SIZE,
859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &sensorSize);
860f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
865f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
868f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
869f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
870f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 0);
871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
872f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange;
873f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
874f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &exposureCompensationRange);
876f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
877f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
881f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationStep;
883f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
884f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
885f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &exposureCompensationStep);
886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
887f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].numerator /
889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, "false");
892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true");
893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, "false");
895f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true");
896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
899f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_METERING_AREAS,
900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ZOOM, 0);
9036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
904f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
905f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom;
906f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxDigitalZoom);
908f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
910f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
913f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
9146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                (NUM_ZOOM_STEPS-1);
915f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
9166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
918f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
919f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ZOOM_SUPPORTED, "true");
926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true");
927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_FOCUS_DISTANCES,
929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
931f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t maxFacesDetected;
932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
933f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_STATS_MAX_FACE_COUNT,
934f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &maxFacesDetected);
935f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            maxFacesDetected.data.i32[0]);
937f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
938f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
939f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
941f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "yuv420sp");
942f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
943f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_RECORDING_HINT,
944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "false");
945f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
946f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
947f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "true");
948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
949f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION,
950f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "false");
951f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes;
953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableVideoStabilizationModes);
956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
957f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
958f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "true");
960f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
961f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
962f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "false");
963f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
964f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
965f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
966f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
96761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
9686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest() {
969a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
9716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
9726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
9736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
9746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
9756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
9766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
9776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
9786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
9796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
9806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // TODO: Adjust for mParams changes
9816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
9826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
98461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
985