Camera2Client.cpp revision 611f61998863d3a3ffae4e5f2b723b7319c59ddf
161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala/*
261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * you may not use this file except in compliance with the License.
661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * You may obtain a copy of the License at
761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
1061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * See the License for the specific language governing permissions and
1461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * limitations under the License.
1561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala */
1661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define LOG_TAG "Camera2Client"
1861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
19f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Log.h>
2061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <cutils/properties.h>
2261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/SurfaceTextureClient.h>
2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h>
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
25f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <math.h>
26f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Client.h"
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#define ALOG1_ENTRY        \
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    int callingPid = getCallingPid(); \
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    ALOG1("%s: E (pid %d, id %d) ", __FUNCTION__, \
37f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            callingPid, mCameraId)
38f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
39f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#define ALOG1_EXIT        \
40f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    ALOG1("%s: X (pid %d, id %d) ", __FUNCTION__, \
41f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            callingPid, mCameraId)
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingUid() {
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingUid();
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
5461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
5561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
5761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int clientPid):
5861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        Client(cameraService, cameraClient,
59f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                cameraId, cameraFacing, clientPid),
60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams(NULL)
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
6261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    ALOG1_ENTRY;
6361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    ALOG1_EXIT;
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    ALOG1_ENTRY;
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = buildDefaultParameters();
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->dump();
91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    ALOG1_EXIT;
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
9561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
9661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
9761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mParams) delete mParams;
101f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
10361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
10461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
10561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
106611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
107611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d:\n",
108611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
109611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
110611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
111611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
112611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
11361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
11461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
11661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
118f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
119f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
121f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice->setStreamingRequest(NULL);
122f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
12361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
12461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
12561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
12761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
12861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
12961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
13161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
13261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
13561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
13661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(const sp<Surface>& surface) {
13961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
14061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(const sp<ISurfaceTexture>& surfaceTexture) {
14361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
14461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
14761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
15061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
15161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
15261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
15361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
15461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
15561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
15661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
15761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
15861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
15961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return false;
16061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
16161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
16261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
16361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
16461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
16561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
16661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
16761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
16861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
16961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
17061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
17161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
17261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
17361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
17461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
17561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
17661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
17761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
17861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
17961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
18061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
18161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
18261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
18361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
18461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
18561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
18661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
18761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
18861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
18961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
19061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
19161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
19261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
19361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
19461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
19561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
196f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
198f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return mParams->flatten();
19961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
20061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
20161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
20261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
20361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
20461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
205f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// private methods
206f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
207f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
208f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
209f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mParams) {
210f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        delete mParams;
211f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
212f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams = new CameraParameters;
213f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
214f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableProcessedSizes;
215f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
216f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
217f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableProcessedSizes);
218f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
219f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableProcessedSizes.count < 2) {
220f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
221f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
222f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
223f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
224f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES));
225f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
226f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
227f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
228f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
229f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewWidth = availableProcessedSizes.data.i32[0];
230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewHeight = availableProcessedSizes.data.i32[1];
231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
232f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setPreviewSize(previewWidth, previewHeight);
233f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setVideoSize(previewWidth, previewHeight);
234f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
235f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            String8::format("%dx%d",previewWidth,previewHeight));
236f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
237f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
238f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
239f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
240f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
241f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
242f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
243f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
244f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
245f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
246f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
247f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
248f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
249f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
250f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableFpsRanges;
251f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
252f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
253f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableFpsRanges);
254f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
255f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableFpsRanges.count < 2) {
256f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
257f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
258f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
259f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
260f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
261f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
262f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
263f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
264f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewFpsRangeMin = availableFpsRanges.data.i32[0];
265f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int previewFpsRangeMax = availableFpsRanges.data.i32[1];
266f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
267f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
268f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            String8::format("%d,%d", previewFpsRangeMin, previewFpsRangeMax));
269f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
270f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
271f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
272f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
273f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
274f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
275f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
276f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
277f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
278f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
279f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
280f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
281f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
282f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREVIEW_FORMAT,
283f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "yuv420sp"); // NV21
284f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
285f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableFormats;
286f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
287f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_FORMATS,
288f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableFormats);
289f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
290f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
291f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
292f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
293f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
294f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
295f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
296f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
297f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv422sp";
298f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
299f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
300f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv420sp";
301f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
302f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
303f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv422i-yuyv";
304f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
305f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
306f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "yuv420p";
307f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
308f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
309f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats += "rgb565";
310f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
311f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
313f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
314f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
315f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
316f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
317f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
318f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
319f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
320f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
321f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
324f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
325f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
326f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
327f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
328f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
329f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            previewFpsRangeMin);
331f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
332f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
333f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
335f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
337f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
338f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
339f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
340f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
342f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
343f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableJpegSizes;
344f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
345f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
346f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableJpegSizes);
347f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
348f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableJpegSizes.count < 2) {
349f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
350f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
351f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
352f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
353f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_SCALER_AVAILABLE_JPEG_SIZES));
354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
356f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
357f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
358f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t pictureWidth = availableJpegSizes.data.i32[0];
359f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t pictureHeight = availableJpegSizes.data.i32[1];
360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setPictureSize(pictureWidth, pictureHeight);
362f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
363f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
364f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
365f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
366f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
367f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
368f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
370f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
371f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
372f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
373f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
375f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setPictureFormat("jpeg");
376f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
378f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "jpeg");
379f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
380f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableJpegThumbnailSizes;
381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableJpegThumbnailSizes);
384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableJpegThumbnailSizes.count < 2) {
386f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: "
387f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Malformed %s entry",
388f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId,
389f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                get_camera_metadata_tag_name(
390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES));
391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
393f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
395f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
396f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int32_t jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
397f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
398f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
399f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            jpegThumbWidth);
400f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
401f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            jpegThumbHeight);
402f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
404f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
405f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
409f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
410f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
412f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
413f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
415f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
416f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "90");
417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_JPEG_QUALITY,
418f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "90");
419f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ROTATION,
420f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "0");
421f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // Not settting GPS fields
422f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
423f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_WHITE_BALANCE,
424f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "auto");
425f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableWhiteBalanceModes;
427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
428f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AWB_AVAILABLE_MODES,
429f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableWhiteBalanceModes);
430f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
431f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
432f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
433f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
436f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
437f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
438f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "auto";
439f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
440f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
441f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "incandescent";
442f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
443f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
444f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "fluorescent";
445f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
446f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
447f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "warm-fluorescent";
448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
449f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
450f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "daylight";
451f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
452f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
453f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "cloudy-daylight";
454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
456f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "twilight";
457f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
458f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
459f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance += "shade";
460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
461f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
462f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
463f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
464f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
465f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
466f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
467f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
468f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
469f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
470f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
471f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
472f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
473f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
474f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
475f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
476f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
477f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_EFFECT, "none");
478f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableEffects;
479f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
480f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AVAILABLE_EFFECTS,
481f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableEffects);
482f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
483f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
484f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
485f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
486f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
487f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
488f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
489f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
490f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
491f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "none";
492f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
493f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
494f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "mono";
495f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
496f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "negative";
497f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
498f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
499f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "solarize";
500f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
501f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
502f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "sepia";
503f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
504f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
505f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "posterize";
506f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
507f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
508f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "whiteboard";
509f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
510f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
511f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "blackboard";
512f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
513f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
514f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedEffects += "aqua";
515f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
516f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
517f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
518f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
519f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
520f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
521f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
522f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
523f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
524f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
525f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
526f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ANTIBANDING, "auto");
527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableAntibandingModes;
528f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
529f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
530f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableAntibandingModes);
531f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
532f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
533f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
534f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
536f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
537f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
540f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "off";
541f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
542f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
543f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "50hz";
544f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
545f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
546f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "60hz";
547f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
548f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
549f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedAntibanding += "auto";
550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
554f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
558f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
559f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
560f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
562f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_SCENE_MODE, "auto");
564f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableSceneModes;
565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
566f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableSceneModes);
568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedSceneModes("auto");
571f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
576f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
577f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
578f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "action";
586f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "portrait";
589f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "landscape";
592f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "night";
595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "night-portrait";
598f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "theatre";
601f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
602f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
603f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "beach";
604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
606f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "snow";
607f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
608f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
609f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "sunset";
610f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
611f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
612f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "steadyphoto";
613f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
614f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "fireworks";
616f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
617f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
618f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "sports";
619f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
620f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
621f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "party";
622f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
624f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "candlelight";
625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes += "barcode";
628f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
629f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]);
632f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
633f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mParams->set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t flashAvailable;
643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_FLASH_AVAILABLE, &flashAvailable);
645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
647f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableAeModes;
648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
649f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_AVAILABLE_MODES,
650f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableAeModes);
651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
653f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_FLASH_MODE, "auto");
655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedFlashModes("off,auto,on,torch");
656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes += ",red-eye";
660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t minFocusDistance;
668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &minFocusDistance);
671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableAfModes;
673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AF_AVAILABLE_MODES,
675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableAfModes);
676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
677f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_FOCUS_MODE, "fixed");
680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, "fixed");
681f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
682f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_FOCUS_MODE, "auto");
683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedFocusModes("fixed,infinity");
684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
686f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
687f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "auto";
691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "macro";
694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "continuous-video";
697f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "continuous-picture";
700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedFocusModes += "edof";
703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not supported in v1 API
705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
719f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t max3aRegions;
720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_MAX_REGIONS, &max3aRegions);
722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
724f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_FOCUS_AREAS,
727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableFocalLengths;
730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableFocalLengths);
733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
734f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
735f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
736f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
737f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t sensorSize;
738f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
739f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SENSOR_PHYSICAL_SIZE,
740f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &sensorSize);
741f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
742f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
743f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
744f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
745f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
747f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
748f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
749f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
751f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 0);
752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange;
754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &exposureCompensationRange);
757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
762f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationStep;
764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
765f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &exposureCompensationStep);
767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
769f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].numerator /
770f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, "false");
773f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true");
774f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, "false");
776f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true");
777f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
778f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
780f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_METERING_AREAS,
781f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
782f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ZOOM, 0);
784f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_ZOOM, kNumZoomSteps - 1);
785f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
786f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom;
787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxDigitalZoom);
789f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
790f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
791f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
795f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                (kNumZoomSteps-1);
796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < kNumZoomSteps; i++) {
798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
800f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
801f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
802f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
804f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
805f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
806f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_ZOOM_SUPPORTED, "true");
807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true");
808f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
809f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_FOCUS_DISTANCES,
810f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
811f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
812f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t maxFacesDetected;
813f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
814f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_STATS_MAX_FACE_COUNT,
815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &maxFacesDetected);
816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            maxFacesDetected.data.i32[0]);
818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "yuv420sp");
823f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
824f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_RECORDING_HINT,
825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "false");
826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
828f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "true");
829f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION,
831f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "false");
832f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
833f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes;
834f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
835f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
836f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            &availableVideoStabilizationModes);
837f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) return res;
838f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
839f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
840f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "true");
841f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
842f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
843f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "false");
844f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
846f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
847f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
84861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
84961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
850