Camera2Client.cpp revision 9e4c3db01ba4eb1e5acbed113f78a31374900df6
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), 55d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mPreviewStreamId(NO_STREAM), 56d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mPreviewRequest(NULL), 57d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId(NO_STREAM), 589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureRequest(NULL), 599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingStreamId(NO_STREAM), 609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingRequest(NULL) 61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 62a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice = new Camera2Device(cameraId); 65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module) 68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 69a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 709e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = mDevice->initialize(module); 74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = buildDefaultParameters(); 81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (gLogLevel >= 1) { 88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCameraId); 903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGD("%s", mParamsFlattened.string()); 91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = STOPPED; 946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 9661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 9761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 9861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() { 99a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1004ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId); 1014ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDestructionStarted = true; 103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala disconnect(); 1053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 10661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 10761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 10861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) { 109611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala String8 result; 1103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", 111611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mCameraId, 112611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala getCameraClient()->asBinder().get(), 113611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mClientPid); 1147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" State: "); 1157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 1167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1174ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append(getStateName(mState)); 1187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append("\n Current parameters:\n"); 1207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview size: %d x %d\n", 1217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.previewWidth, mParameters.previewHeight); 1227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview FPS range: %d - %d\n", 12311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.previewFpsRange[0], mParameters.previewFpsRange[1]); 1247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview HAL pixel format: 0x%x\n", 1257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.previewFormat); 12611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala result.appendFormat(" Preview transform: %x\n", 12711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.previewTransform); 1287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Picture size: %d x %d\n", 1297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.pictureWidth, mParameters.pictureHeight); 1307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 13111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.jpegThumbSize[0], mParameters.jpegThumbSize[1]); 1327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 1337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.jpegQuality, mParameters.jpegThumbQuality); 1347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg rotation: %d\n", mParameters.jpegRotation); 1357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS tags %s\n", 1367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.gpsEnabled ? "enabled" : "disabled"); 1377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala if (mParameters.gpsEnabled) { 1387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 13911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.gpsCoordinates[0], mParameters.gpsCoordinates[1], 14011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.gpsCoordinates[2]); 1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS timestamp: %lld\n", 1427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.gpsTimestamp); 1437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS processing method: %s\n", 1447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.gpsProcessingMethod.string()); 1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" White balance mode: "); 1487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala switch (mParameters.wbMode) { 1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO) 1507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT) 1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT) 1527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT) 1537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT) 1547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT) 1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT) 1567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE) 1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Effect mode: "); 1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala switch (mParameters.effectMode) { 1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF) 1637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO) 1647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE) 1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE) 1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA) 1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE) 1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD) 1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD) 1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA) 1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Antibanding mode: "); 1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala switch (mParameters.antibandingMode) { 1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO) 1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF) 1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ) 1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ) 1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Scene mode: "); 1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala switch (mParameters.sceneMode) { 1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append("AUTO\n"); break; 1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Flash mode: "); 2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala switch (mParameters.flashMode) { 2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focus mode: "); 2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala switch (mParameters.focusMode) { 2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focusing areas:\n"); 2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) { 2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.focusingAreas[i].left, 2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.focusingAreas[i].top, 2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.focusingAreas[i].right, 2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.focusingAreas[i].bottom, 2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.focusingAreas[i].weight); 2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Exposure compensation index: %d\n", 2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.exposureCompensation); 2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" AE lock %s, AWB lock %s\n", 2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.autoExposureLock ? "enabled" : "disabled", 2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" ); 2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Metering areas:\n"); 2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) { 2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.meteringAreas[i].left, 2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.meteringAreas[i].top, 2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.meteringAreas[i].right, 2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.meteringAreas[i].bottom, 2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.meteringAreas[i].weight); 2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Zoom index: %d\n", mParameters.zoom); 2573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Video size: %d x %d\n", mParameters.videoWidth, 2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.videoHeight); 2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2603297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Recording hint is %s\n", 2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.recordingHint ? "set" : "not set"); 2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Video stabilization is %s\n", 2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala mParameters.videoStabilization ? "enabled" : "disabled"); 2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current streams:\n"); 2673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Preview stream ID: %d\n", mPreviewStreamId); 2683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Capture stream ID: %d\n", mCaptureStreamId); 2693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current requests:\n"); 2713297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mPreviewRequest != NULL) { 2723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Preview request:\n"); 2733297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2743297daae9681004775012faba9181d65e097e00cEino-Ville Talvala dump_camera_metadata(mPreviewRequest, fd, 2); 2753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 2763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Preview request: undefined\n"); 2773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 2793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mCaptureRequest != NULL) { 2813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Capture request:\n"; 2823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala dump_camera_metadata(mCaptureRequest, fd, 2); 2843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 2853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Capture request: undefined\n"; 2863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 2883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Device dump:\n"; 290611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala write(fd, result.string(), result.size()); 2917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t res = mDevice->dump(fd, args); 2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (res != OK) { 2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Error dumping device: %s (%d)", 2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala strerror(-res), res); 2963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 2987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM 300611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala return NO_ERROR; 30161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 30261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3034ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) { 3044ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 3054ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala switch(state) { 3064ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(NOT_INITIALIZED) 3074ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 3084ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 3094ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 3104ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 3114ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 3124ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 3134ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala default: 3144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return "Unknown state!"; 3154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala break; 3164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 3174ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR 3184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala} 3194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 32061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface 32161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 32261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() { 323a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3249e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 325ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 326ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 327f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mDevice == 0) return; 328f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 329ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala stopPreviewLocked(); 3306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 331d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->waitUntilDrained(); 332d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 333d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 3346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mDevice->deleteStream(mPreviewStreamId); 335d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mPreviewStreamId = NO_STREAM; 336d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 337d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 338d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureStreamId != NO_STREAM) { 339d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->deleteStream(mCaptureStreamId); 340d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId = NO_STREAM; 3416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 342f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 343898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 344898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala mDevice->deleteStream(mRecordingStreamId); 345898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala mRecordingStreamId = NO_STREAM; 346898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala } 347898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 34861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala CameraService::Client::disconnect(); 34961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 35061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 35161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) { 352a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3539e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 354ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 355ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 3569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != 0 && getCallingPid() != mClientPid) { 3579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Connection attempt from pid %d; " 3589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "current locked to pid %d", __FUNCTION__, 3599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraId, getCallingPid(), mClientPid); 3609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return BAD_VALUE; 3619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 3629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 3649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient = client; 3659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 36761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 36861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 36961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() { 370a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3719e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 372ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 3739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 3749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 375ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 3769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == 0) { 3779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 3789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 3799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 3809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != getCallingPid()) { 3829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 3839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 3849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 3859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 3869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 38861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 38961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 39061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() { 391a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3929e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 393ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 3949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 3959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 396ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 3979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Check for uninterruptable conditions 3989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == getCallingPid()) { 4009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = 0; 4019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient.clear(); 4029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 4069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 40861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 40961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay( 4116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<Surface>& surface) { 412a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4139e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 414ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 415ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surface != 0) { 4196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surface->asBinder(); 4206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = surface; 4216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 423d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return setPreviewWindowLocked(binder,window); 42461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 42561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture( 4276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<ISurfaceTexture>& surfaceTexture) { 428a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4299e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 430ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 431ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surfaceTexture != 0) { 4356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surfaceTexture->asBinder(); 4366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = new SurfaceTextureClient(surfaceTexture); 4376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 438d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return setPreviewWindowLocked(binder, window); 4396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 4406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 441d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder, 442be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala sp<ANativeWindow> window) { 443a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 4456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (binder == mPreviewSurface) { 4479e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: New window is same as old window", 4489e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId); 4496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return NO_ERROR; 4506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case NOT_INITIALIZED: 4549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 4559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STILL_CAPTURE: 4569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 4579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 4589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 4599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK 4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Already running preview - need to stop and create a new stream 4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Optimize this so that we don't wait for old stream to drain 4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // before spinning up new stream 4689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mDevice->setStreamingRequest(NULL); 4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = WAITING_FOR_PREVIEW_WINDOW; 4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 473d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 474be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->waitUntilDrained(); 475be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 476be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error waiting for preview to drain: %s (%d)", 477be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 478be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 479be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->deleteStream(mPreviewStreamId); 4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 482be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Unable to delete old preview stream: %s (%d)", 483be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 486be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewStreamId = NO_STREAM; 4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 489bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala mPreviewSurface = binder; 490be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewWindow = window; 491bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 4926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState == WAITING_FOR_PREVIEW_WINDOW) { 493d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return startPreviewLocked(); 4946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 49761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 49861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 49961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) { 500a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 501ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 50261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 50361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 50461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() { 505a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5069e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 507ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 508d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return startPreviewLocked(); 509d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 510ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 511d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::startPreviewLocked() { 512d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 5136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 5144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (mState >= PREVIEW) { 5154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGE("%s: Can't start preview in state %s", 5164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala __FUNCTION__, getStateName(mState)); 5174ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return INVALID_OPERATION; 5184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 5196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewWindow == 0) { 5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = WAITING_FOR_PREVIEW_WINDOW; 5226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 5236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 524be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mState = STOPPED; 5256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala Mutex::Autolock pl(mParamsLock); 5279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 528be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updatePreviewStream(); 529be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 530be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 531be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 532be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 5336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 535be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewRequest == NULL) { 536be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updatePreviewRequest(); 537be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 538be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)", 539be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 541be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 5426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mPreviewRequest, 545be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 546be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mPreviewStreamId, 1); 5476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 5486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)", 5496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 550be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 551be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 552be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = sort_camera_metadata(mPreviewRequest); 553be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 554be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)", 555be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 5566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 5576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 5606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 561bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview request to start preview: " 562bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala "%s (%d)", 5636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 5646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 5656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = PREVIEW; 5676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 56961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 57061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 57161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() { 572a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5739e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 574ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 575ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala stopPreviewLocked(); 576ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala} 577ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 578ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvalavoid Camera2Client::stopPreviewLocked() { 579ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala ATRACE_CALL(); 580d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 581d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case NOT_INITIALIZED: 582d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Call before initialized", 583d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 584d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 585d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STOPPED: 586d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 587d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 588d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot stop preview during still capture.", 589d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 590d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 591d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 592d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Handle record stop here 593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 594d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->setStreamingRequest(NULL); 595d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 596d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STOPPED; 597d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 598d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 599d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 600d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState); 601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 60261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 60361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 60461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() { 605a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 606ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return mState == PREVIEW; 60861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 60961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 61061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 611a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 612ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 61361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return BAD_VALUE; 61461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 61561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 61661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() { 617a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6189e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 619ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 6219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 6229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 6239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = startPreviewLocked(); 6249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) return res; 6259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 6279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Ready to go 6289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 6309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 6319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to call this when recording is already on 6329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 6339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 6359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't start recording in state %s", 6369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 6379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 6389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 6399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 6409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala Mutex::Autolock pl(mParamsLock); 6419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 6429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateRecordingStream(); 6439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 6449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 6459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 6479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 6499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingRequest == NULL) { 6509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateRecordingRequest(); 6519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 6529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)", 6539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 6559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 6589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId }; 6599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mRecordingRequest, 6609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 6619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala outputStreams, 2); 6629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 6639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)", 6649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 6669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = sort_camera_metadata(mRecordingRequest); 6689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 6699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)", 6709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 6729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 6749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mRecordingRequest); 6759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 6769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set recording request to start " 6779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "recording: %s (%d)", __FUNCTION__, mCameraId, 6789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 6799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 6809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = RECORD; 6829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 6839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 68461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 68561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 68661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() { 687a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6889e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 689ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 6919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 6929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 6939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to stop 6949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 6969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 6979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STILL_CAPTURE: 6989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 6999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 7009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop recording in state %s", 7019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 7029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 7039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 7049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Back to preview. Since record can only be reached through preview, 7069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // all preview stream setup should be up to date. 7079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 7089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to switch back to preview request: " 7109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 7119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 7129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Should recording heap be freed? Can't do it yet since requests 7159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // could still be in flight. 7169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = PREVIEW; 71861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 71961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 72061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() { 721a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 722ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return (mState == RECORD || mState == VIDEO_SNAPSHOT); 72461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 72561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 72661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 727a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 728ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Make sure this is for the current heap 7309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ssize_t offset; 7319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size; 7329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 7339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) { 7349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release " 7359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "(got %x, expected %x)", __FUNCTION__, mCameraId, 7369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala heap->getHeapID(), mRecordingHeap->mHeap->getHeapID()); 7379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 7389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree++; 74061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 74161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 74261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() { 743a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 744ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 74661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 74761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 74861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() { 749a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 750ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 75261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 75361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 75461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) { 755a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 756ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 757d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 758d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 759d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 760d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case NOT_INITIALIZED: 761d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STOPPED: 762d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 763d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 764d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 765d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 766d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 767d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 768d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Good to go for takePicture 769d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 770d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 771d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case VIDEO_SNAPSHOT: 772d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Already taking a picture", 773d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 774d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 775d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 776d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 777d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala Mutex::Autolock pl(mParamsLock); 778d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 779d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = updateCaptureStream(); 7804ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 781be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 782be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7834ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 7844ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 785d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 786d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureRequest == NULL) { 7874ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala res = updateCaptureRequest(); 7884ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 789be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't create still image capture request: " 790be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 7914ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 7924ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 793d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 794d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 795d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_entry_t outputStreams; 7969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState == PREVIEW) { 7979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId }; 7989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS, 7999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &streamIds, 2); 8009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } else if (mState == RECORD) { 8019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId, 8029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureStreamId }; 8039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS, 8049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &streamIds, 3); 8059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 8069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 807d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 808d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still image capture request: " 809d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 810d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 811d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 812d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 813be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = sort_camera_metadata(mCaptureRequest); 814be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 815be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)", 816be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 817be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 818be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 819d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 820d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest); 821d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (captureCopy == NULL) { 822d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 823d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 824d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return NO_MEMORY; 825d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 826d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 827d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mState == PREVIEW) { 828d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->setStreamingRequest(NULL); 829d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 830d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 831d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 832d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 833d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 834d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 835d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 8369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 837d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->capture(captureCopy); 838d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 839d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 840d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 841d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 842d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 843d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 844d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 845d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 846d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 847d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STILL_CAPTURE; 848d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 849d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 850d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = VIDEO_SNAPSHOT; 851d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 852d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 853d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state for still capture!", 854d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 855d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 856d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 858d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 85961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 86061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 86161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) { 862a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 8639e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 864ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 8656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Mutex::Autolock pl(mParamsLock); 8666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala status_t res; 8676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 8686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala CameraParameters newParams(params); 8696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 8706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only 8716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // parameters such as supported preview sizes, etc. Should probably 8726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // produce an error if they're changed. 8736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 8746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala /** Extract and verify new parameters */ 8756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 8766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t i; 8776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 8786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_SIZE 8796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int previewWidth, previewHeight; 8806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getPreviewSize(&previewWidth, &previewHeight); 8816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 8826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (previewWidth != mParameters.previewWidth || 8836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala previewHeight != mParameters.previewHeight) { 8846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState >= PREVIEW) { 8856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 8879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, 8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mParameters.previewWidth, mParameters.previewHeight, 8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala previewWidth, previewHeight); 8906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 8916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 8926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePreviewSizes = 8936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 8946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePreviewSizes.count; i += 2 ) { 8956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availablePreviewSizes.data.i32[i] == previewWidth && 8966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availablePreviewSizes.data.i32[i+1] == previewHeight) break; 8976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 8986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePreviewSizes.count) { 8996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 9006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, previewWidth, previewHeight); 9016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FPS_RANGE 90611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int previewFpsRange[2]; 90711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int previewFps = 0; 9086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool fpsRangeChanged = false; 90911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]); 91011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala if (previewFpsRange[0] != mParameters.previewFpsRange[0] || 91111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1] != mParameters.previewFpsRange[1]) { 9126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala fpsRangeChanged = true; 9136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePreviewFpsRanges = 9146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 9156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 9166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 91711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[0]) && 9186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 91911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1]) ) { 9206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala break; 9216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 9246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 92511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala __FUNCTION__, previewFpsRange[0], previewFpsRange[1]); 9266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 92811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFps = previewFpsRange[0]; 9296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FORMAT 9326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int previewFormat = formatStringToEnum(newParams.getPreviewFormat()); 9336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (previewFormat != mParameters.previewFormat) { 9346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState >= PREVIEW) { 9356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 9366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "is active!", __FUNCTION__); 9376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFormats = 9406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 9416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFormats.count; i++) { 9426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableFormats.data.i32[i] == previewFormat) break; 9436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFormats.count) { 9456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 9466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), previewFormat); 9476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FRAME_RATE 9526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Deprecated, only use if the preview fps range is unchanged this time. 9536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // The single-value FPS is the same as the minimum of the range. 9546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (!fpsRangeChanged) { 9556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala previewFps = newParams.getPreviewFrameRate(); 9566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (previewFps != mParameters.previewFps) { 9576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFrameRates = 9586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 9596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 9606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableFrameRates.data.i32[i] == previewFps) break; 9616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFrameRates.count) { 9636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 9646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, previewFps); 9656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 96711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[0] = availableFrameRates.data.i32[i]; 96811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1] = availableFrameRates.data.i32[i+1]; 9696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PICTURE_SIZE 9736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int pictureWidth, pictureHeight; 9746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getPictureSize(&pictureWidth, &pictureHeight); 9756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (pictureWidth == mParameters.pictureWidth || 9766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala pictureHeight == mParameters.pictureHeight) { 9776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePictureSizes = 9786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 9796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePictureSizes.count; i+=2) { 9806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availablePictureSizes.data.i32[i] == pictureWidth && 9816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availablePictureSizes.data.i32[i+1] == pictureHeight) break; 9826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePictureSizes.count) { 9846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 9856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, pictureWidth, pictureHeight); 9866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 99111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int jpegThumbSize[2]; 99211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[0] = 9936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 99411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[1] = 9956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 99611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala if (jpegThumbSize[0] != mParameters.jpegThumbSize[0] || 99711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[1] != mParameters.jpegThumbSize[1]) { 9986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableJpegThumbSizes = 9996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 10006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 100111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] && 100211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) { 10036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala break; 10046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 10076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 100811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]); 10096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 10146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegThumbQuality = 10156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 10166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegThumbQuality < 0 || jpegThumbQuality > 100) { 10176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 10186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegThumbQuality); 10196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_QUALITY 10236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegQuality = 10246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 10256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegQuality < 0 || jpegQuality > 100) { 10266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 10276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegQuality); 10286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ROTATION 10326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegRotation = 10336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 10346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegRotation != 0 && 10356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 90 && 10366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 180 && 10376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 270) { 10386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 10396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegRotation); 10406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // GPS 10446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool gpsEnabled = false; 104511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala double gpsCoordinates[3] = {0,0,0}; 10466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int64_t gpsTimestamp = 0; 10476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala String8 gpsProcessingMethod; 10486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsLatStr = 10496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 10506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (gpsLatStr != NULL) { 10516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsLongStr = 10526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 10536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsAltitudeStr = 10546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 10556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsTimeStr = 10566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 10576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsProcMethodStr = 10586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 10596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (gpsLongStr == NULL || 10606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsAltitudeStr == NULL || 10616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsTimeStr == NULL || 10626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsProcMethodStr == NULL) { 10636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 10646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__); 10656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala char *endPtr; 10686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 106911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 10706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 10716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 10726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 107511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 10766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 10776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 10786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 108111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 10826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 10836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 10846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsAltitudeStr); 10856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 10886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 10896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 10906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 10916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsProcessingMethod = gpsProcMethodStr; 10946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsEnabled = true; 10966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // WHITE_BALANCE 10996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int wbMode = wbModeStringToEnum( 11006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 11016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (wbMode != mParameters.wbMode) { 11026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableWbModes = 11036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 11046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 11056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (wbMode == availableWbModes.data.u8[i]) break; 11066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableWbModes.count) { 11086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 11096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 11106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 11116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // EFFECT 11166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int effectMode = effectModeStringToEnum( 11176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 11186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (effectMode != mParameters.effectMode) { 11196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableEffectModes = 11206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 11216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (effectMode == availableEffectModes.data.u8[i]) break; 11236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableEffectModes.count) { 11256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 11266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 11276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 11286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ANTIBANDING 11336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int antibandingMode = abModeStringToEnum( 11346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 11356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (antibandingMode != mParameters.antibandingMode) { 11366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableAbModes = 11376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 11386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 11396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (antibandingMode == availableAbModes.data.u8[i]) break; 11406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableAbModes.count) { 11426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 11436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 11446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 11456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // SCENE_MODE 11506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int sceneMode = sceneModeStringToEnum( 11516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 11526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (sceneMode != mParameters.sceneMode) { 11536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableSceneModes = 11546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 11556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 11566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (sceneMode == availableSceneModes.data.u8[i]) break; 11576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableSceneModes.count) { 11596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 11606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 11616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FLASH_MODE 11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::flashMode_t flashMode = flashModeStringToEnum( 11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (flashMode != mParameters.flashMode) { 11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t flashAvailable = 11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 11726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (!flashAvailable.data.u8[0] && 11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala flashMode != Parameters::FLASH_MODE_OFF) { 11746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 11756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "No flash on device", __FUNCTION__, 11766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) { 11796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableAeModes = 11806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 11816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 11826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (flashMode == availableAeModes.data.u8[i]) break; 11836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableAeModes.count) { 11856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 11866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 11876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 11886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (flashMode == -1) { 11916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 11926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 11936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FOCUS_MODE 11996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::focusMode_t focusMode = focusModeStringToEnum( 12006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 12016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode != mParameters.focusMode) { 12026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode != Parameters::FOCUS_MODE_FIXED) { 12036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t minFocusDistance = 12046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE); 12056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 12066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 12076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "fixed focus lens", 12086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 12106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) { 12126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFocusModes = 12136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 12146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 12156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode == availableFocusModes.data.u8[i]) break; 12166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFocusModes.count) { 12186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 12196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 12216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FOCUS_AREAS 12286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> focusingAreas; 12296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 12306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala &focusingAreas); 12316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t max3aRegions = 12326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 12336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 12346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res != OK) { 12356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 12366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 12376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // EXPOSURE_COMPENSATION 12416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int exposureCompensation = 12426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 12436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t exposureCompensationRange = 12446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE); 12456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (exposureCompensation < exposureCompensationRange.data.i32[0] || 12466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala exposureCompensation > exposureCompensationRange.data.i32[1]) { 12476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 12486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, exposureCompensation); 12496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // AUTO_EXPOSURE_LOCK (always supported) 12536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool autoExposureLock = boolFromString( 12546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 12556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // AUTO_WHITEBALANCE_LOCK (always supported) 12576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool autoWhiteBalanceLock = boolFromString( 12586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 12596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // METERING_AREAS 12616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> meteringAreas; 12626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 12636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala &meteringAreas); 12646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 12656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res != OK) { 12666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 12676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 12696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ZOOM 12736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 12746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) { 12756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested zoom level %d is not supported", 12766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, zoom); 12776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // VIDEO_SIZE 12816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int videoWidth, videoHeight; 12826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getVideoSize(&videoWidth, &videoHeight); 12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (videoWidth != mParameters.videoWidth || 12846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala videoHeight != mParameters.videoHeight) { 12856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState == RECORD) { 12866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Video size cannot be updated when recording is active!", 12876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__); 12886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableVideoSizes = 12916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 12926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableVideoSizes.count; i += 2 ) { 12936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableVideoSizes.data.i32[i] == videoWidth && 12946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availableVideoSizes.data.i32[i+1] == videoHeight) break; 12956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableVideoSizes.count) { 12976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested video size %d x %d is not supported", 12986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, videoWidth, videoHeight); 12996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // RECORDING_HINT (always supported) 13046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool recordingHint = boolFromString( 13056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 13066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // VIDEO_STABILIZATION 13086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool videoStabilization = boolFromString( 13096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 13106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableVideoStabilizationModes = 13116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 13126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (videoStabilization && availableVideoStabilizationModes.count == 1) { 13136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 13146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala /** Update internal parameters */ 13179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 13186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.previewWidth = previewWidth; 13196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.previewHeight = previewHeight; 132011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.previewFpsRange[0] = previewFpsRange[0]; 132111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.previewFpsRange[1] = previewFpsRange[1]; 13226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.previewFps = previewFps; 13236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.previewFormat = previewFormat; 13246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.pictureWidth = pictureWidth; 13266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.pictureHeight = pictureHeight; 13276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 132811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.jpegThumbSize[0] = jpegThumbSize[0]; 132911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.jpegThumbSize[1] = jpegThumbSize[1]; 13306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.jpegQuality = jpegQuality; 13316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.jpegThumbQuality = jpegThumbQuality; 13326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.gpsEnabled = gpsEnabled; 133411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.gpsCoordinates[0] = gpsCoordinates[0]; 133511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.gpsCoordinates[1] = gpsCoordinates[1]; 133611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.gpsCoordinates[2] = gpsCoordinates[2]; 13376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.gpsTimestamp = gpsTimestamp; 13386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.gpsProcessingMethod = gpsProcessingMethod; 13396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.wbMode = wbMode; 13416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.effectMode = effectMode; 13426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.antibandingMode = antibandingMode; 13436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.sceneMode = sceneMode; 13446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.flashMode = flashMode; 13466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.focusMode = focusMode; 13476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.focusingAreas = focusingAreas; 13496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.exposureCompensation = exposureCompensation; 13506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.autoExposureLock = autoExposureLock; 13516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock; 13526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.meteringAreas = meteringAreas; 13536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.zoom = zoom; 13546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.videoWidth = videoWidth; 13566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.videoHeight = videoHeight; 13576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.recordingHint = recordingHint; 13596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala mParameters.videoStabilization = videoStabilization; 13606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 1361be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updatePreviewRequest(); 1362be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1363be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 1364be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1365be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1366be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 1367be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateCaptureRequest(); 1368be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1369be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)", 1370be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1371be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1372be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 1373be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 13749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateRecordingRequest(); 13759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 13769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 13779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 13789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 13799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 13809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1381be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mState == PREVIEW) { 1382be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 1383be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1384be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 1385be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1386be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1387be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 13889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } else if (mState == RECORD || mState == VIDEO_SNAPSHOT) { 13899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mRecordingRequest); 13909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 13919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 13929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 13939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 13949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 1395be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 13966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mParamsFlattened = params; 13989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 13996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 140061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 1401f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 140261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const { 1403a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1404ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 1405ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 1406ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock pl(mParamsLock); 1407ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 14083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala // TODO: Deal with focus distances 14093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return mParamsFlattened; 141061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 141161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 141261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1413a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1414ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 1415c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1416c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1417c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala cmd, arg1, arg2); 1418c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1419c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (cmd == CAMERA_CMD_SET_DISPLAY_ORIENTATION) { 1420c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala int transform = degToTransform(arg1, 1421c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 1422c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (transform == -1) { 1423c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as display orientation value", 1424c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala __FUNCTION__, mCameraId, arg1); 1425c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 1426c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1427c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (transform != mParameters.previewTransform && 1428c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mPreviewStreamId != NO_STREAM) { 1429c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mDevice->setStreamTransform(mPreviewStreamId, transform); 1430c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1431c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mParameters.previewTransform = transform; 1432c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return OK; 1433c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1434c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1435c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unimplemented command %d (%d, %d)", __FUNCTION__, 1436c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraId, cmd, arg1, arg2); 1437c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 14386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 143961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 144061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 14413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */ 14423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1443d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() { 1444d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 1445d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 1446d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala sp<ICameraClient> currentClient; 14479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId); 14489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1449d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala CpuConsumer::LockedBuffer imgBuffer; 1450d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala { 1451d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 1452d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1453d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Signal errors here upstream 1454d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) { 1455d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly!", 1456d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 1457d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1458d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1459d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1460d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mCaptureConsumer->lockNextBuffer(&imgBuffer); 1461d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1462d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)", 1463d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1464d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1465d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1466d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1467d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) { 1468d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected format for still image: " 1469d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%x, expected %x", __FUNCTION__, mCameraId, 1470d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala imgBuffer.format, 1471d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala HAL_PIXEL_FORMAT_BLOB); 1472d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 1473d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1474d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1475d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1476d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Optimize this to avoid memcopy 14779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala void* captureMemory = mCaptureHeap->mHeap->getBase(); 14789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size = mCaptureHeap->mHeap->getSize(); 1479d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala memcpy(captureMemory, imgBuffer.data, size); 1480d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1481d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 1482d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1483d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala currentClient = mCameraClient; 1484d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 1485d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 1486d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STOPPED; 1487d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1488d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case VIDEO_SNAPSHOT: 1489d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = RECORD; 1490d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1491d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 1492d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__, 1493d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCameraId, mState); 1494d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1495d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1496d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1497d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Call outside mICameraLock to allow re-entrancy from notification 1498d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (currentClient != 0) { 1499d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 15009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureHeap->mBuffers[0], NULL); 15019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 15039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() { 15059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ATRACE_CALL(); 15069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 15079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<ICameraClient> currentClient; 15089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t heapIdx = 0; 15099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala nsecs_t timestamp; 15109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala { 15119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala Mutex::Autolock icl(mICameraLock); 15129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Signal errors here upstream 1513898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala bool discardData = false; 15149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RECORD && mState != VIDEO_SNAPSHOT) { 1515898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala ALOGV("%s: Camera %d: Discarding recording image buffers received after " 1516898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala "recording done", 15179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 1518898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala discardData = true; 15199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala CpuConsumer::LockedBuffer imgBuffer; 15229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mRecordingConsumer->lockNextBuffer(&imgBuffer); 15239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 15249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)", 15259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 15279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (imgBuffer.format != (int)kRecordingFormat) { 15309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unexpected recording format: %x", 15319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, imgBuffer.format); 1532898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala discardData = true; 1533898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala } 1534898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 1535898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala if (discardData) { 15369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->unlockBuffer(imgBuffer); 15379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 15389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 1539898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 15409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t bufferSize = imgBuffer.width * imgBuffer.height * 3 / 2; 15419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingHeap == 0 || 15439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala bufferSize > 15449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mHeap->getSize() / kRecordingHeapCount) { 15459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Creating recording heap with %d buffers of " 15469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "size %d bytes", __FUNCTION__, mCameraId, 15479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala kRecordingHeapCount, bufferSize); 15489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingHeap != 0) { 15499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Previous heap has size %d " 15509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "(new will be %d) bytes", __FUNCTION__, mCameraId, 15519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mHeap->getSize(), 15529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala bufferSize * kRecordingHeapCount); 15539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Need to allocate memory for heap 15559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap.clear(); 15569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap = new Camera2Heap(bufferSize, kRecordingHeapCount, 15589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "Camera2Client::RecordingHeap"); 15599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingHeap->mHeap->getSize() == 0) { 15609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for recording", 15619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 15629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->unlockBuffer(imgBuffer); 15639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 15649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapHead = 0; 15669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree = kRecordingHeapCount; 15679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Optimize this to avoid memcopy 15709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if ( mRecordingHeapFree == 0) { 15719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: No free recording buffers, dropping frame", 15729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 15739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->unlockBuffer(imgBuffer); 15749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 15759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala heapIdx = mRecordingHeapHead; 15779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala timestamp = imgBuffer.timestamp; 15789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapHead = (mRecordingHeapHead + 1) % kRecordingHeapCount; 15799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree--; 15809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Timestamp %lld", 15829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, timestamp); 15839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ssize_t offset; 15859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size; 15869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<IMemoryHeap> heap = 15879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset, 15889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &size); 15899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala memcpy((uint8_t*)heap->getBase() + offset, imgBuffer.data, size); 15919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->unlockBuffer(imgBuffer); 15939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala currentClient = mCameraClient; 15959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Call outside mICameraLock to allow re-entrancy from notification 15979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (currentClient != 0) { 15989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala currentClient->dataCallbackTimestamp(timestamp, 15999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala CAMERA_MSG_VIDEO_FRAME, 16009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mBuffers[heapIdx]); 1601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1602d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 1603d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 16043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag, 16053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala size_t minCount, size_t maxCount) { 16063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala status_t res; 16073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t entry; 16083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala res = find_camera_metadata_entry(mDevice->info(), 16093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tag, 16103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala &entry); 16113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 16123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 16133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 16143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 16153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 16163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 16173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)", 16183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tagSection, tagName, tag, strerror(-res), res); 16193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.count = 0; 16203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.data.u8 = NULL; 16213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } else if (CC_UNLIKELY( 16223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 16233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 16243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 16253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 16263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 16273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 16283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 16293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "Expected between %d and %d values, but got %d values", 16303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 16313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.count = 0; 16323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.data.u8 = NULL; 16333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } 16343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 16353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return entry; 16363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala} 16373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 16383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */ 16393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() { 1642a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1643ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock pl(mParamsLock); 1644ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 1645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 16463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters params; 1647f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 16483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableProcessedSizes = 16493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2); 16503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableProcessedSizes.count) return NO_INIT; 1651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick more intelligently 16533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.previewWidth = availableProcessedSizes.data.i32[0]; 16543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.previewHeight = availableProcessedSizes.data.i32[1]; 16553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.videoWidth = mParameters.previewWidth; 16563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.videoHeight = mParameters.previewHeight; 16573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 16583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight); 16593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight); 16603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 16613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8::format("%dx%d", 16623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.previewWidth, mParameters.previewHeight)); 1663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewSizes; 1665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableProcessedSizes.count; i += 2) { 1666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewSizes += ","; 1667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes += String8::format("%dx%d", 1668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableProcessedSizes.data.i32[i], 1669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableProcessedSizes.data.i32[i+1]); 1670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 16713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 1672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes); 16733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 1674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes); 1675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 16773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFpsRanges = 16783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 16793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableFpsRanges.count) return NO_INIT; 1680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 168111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0]; 168211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1]; 1683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 16843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 16853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8::format("%d,%d", 168611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.previewFpsRange[0], 168711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.previewFpsRange[1])); 1688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFpsRange; 1691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewFpsRange += ","; 1693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFpsRange += String8::format("(%d,%d)", 1694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i], 1695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i+1]); 1696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 16973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 1698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFpsRange); 1699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 17013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 17023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FORMAT, 17033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala formatEnumToString(mParameters.previewFormat)); // NV21 17043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1705c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mParameters.previewTransform = degToTransform(0, 1706c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 1707c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 17083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFormats = 17093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 1710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFormats; 1713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 1714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFormats.count; i++) { 1715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedPreviewFormats += ","; 1716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 1717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableFormats.data.i32[i]) { 1718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1719bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1720bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422SP; 1721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1723bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1724bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 1725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: 1727bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1728bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422I; 1729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: 1731bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1732bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 1733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1734f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 1735bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1736bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGB565; 1737f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 173811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 173911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala supportedPreviewFormats += 174011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGBA8888; 174111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala break; 174211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 1743f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 174411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 1745f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 174711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala 1748f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 1749f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown preview format: %x", 1750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableFormats.data.i32[i]); 1751f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 17553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 1756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFormats); 1757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 1760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // still have to do something sane for them 1761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 17623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 176311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.previewFpsRange[0]); 1764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1765f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFrameRates; 1767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewFrameRates += ","; 1769f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 1770f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i]); 1771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 17723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 1773f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFrameRates); 1774f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 17763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableJpegSizes = 17773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 17783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableJpegSizes.count) return NO_INIT; 1779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1780f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick maximum 17813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.pictureWidth = availableJpegSizes.data.i32[0]; 17823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.pictureHeight = availableJpegSizes.data.i32[1]; 1783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 17843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setPictureSize(mParameters.pictureWidth, 17853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.pictureHeight); 1786f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPictureSizes; 1789f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableJpegSizes.count; i += 2) { 1790f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 1791f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 1792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegSizes.data.i32[i], 1793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegSizes.data.i32[i+1]); 1794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 17953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 1796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPictureSizes); 1797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 17993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 18003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 18013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 1802f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 18033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableJpegThumbnailSizes = 18043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2); 18053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 1806f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick default thumbnail size sensibly 180811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0]; 180911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1]; 1810f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 18113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 181211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.jpegThumbSize[0]); 18133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 181411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala mParameters.jpegThumbSize[1]); 1815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedJpegThumbSizes; 1818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 1819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 1820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 1821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 1822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 1823f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 18243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 1825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedJpegThumbSizes); 1826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 18283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.jpegThumbQuality = 90; 18293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 18303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.jpegThumbQuality); 18313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.jpegQuality = 90; 18323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 18333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.jpegQuality); 18343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.jpegRotation = 0; 18353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 18363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.jpegRotation); 18373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 18383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.gpsEnabled = false; 18393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.gpsProcessingMethod = "unknown"; 18403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 18413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 18423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO; 18433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 18443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 18453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 18463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableWhiteBalanceModes = 18473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 1848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1849f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedWhiteBalance; 1850f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 1851f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 1852f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 1853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 1854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 1855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_AUTO: 1856bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1857bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 1858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_INCANDESCENT: 1860bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1861bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 1862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_FLUORESCENT: 1864bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1865bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 1866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 1868bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1869bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 1870f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_DAYLIGHT: 1872bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1873bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 1874f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 1876bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1877bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 1878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_TWILIGHT: 1880bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1881bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 1882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1883f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_SHADE: 1884bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1885bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 1886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1887f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Skipping values not mappable to v1 API 1888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_OFF: 1889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 1892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 1893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, 1894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 1895f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 18993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 1900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedWhiteBalance); 1901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 19033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF; 19043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 19053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::EFFECT_NONE); 19063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 19073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableEffects = 19083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 19093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableEffects.count) return NO_INIT; 1910f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedEffects; 1912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 1913f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 1914f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedEffects += ","; 1915f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 1916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 1917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_OFF: 1918bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1919bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_NONE; 1920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_MONO: 1922bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1923bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_MONO; 1924bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala break; 1925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_NEGATIVE: 1926bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1927bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 1928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SOLARIZE: 1930bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1931bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 1932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1933f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SEPIA: 1934bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1935bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_SEPIA; 1936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1937f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_POSTERIZE: 1938bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1939bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 1940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1941f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_WHITEBOARD: 1942bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1943bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 1944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1945f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_BLACKBOARD: 1946bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1947bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 1948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1949f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_AQUA: 1950bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1951bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_AQUA; 1952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 1954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 1955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableEffects.data.u8[i]); 1956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1957f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1958f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 19603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 1961f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1962f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 19633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 19643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 19653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 19663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 19673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAntibandingModes = 19683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 19693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAntibandingModes.count) return NO_INIT; 1970f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1971f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedAntibanding; 1972f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 1973f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 1974f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 1975f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 1976f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 1977f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_OFF: 1978bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 1979bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 1980f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1981f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_50HZ: 1982bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 1983bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 1984f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1985f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_60HZ: 1986bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 1987bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 1988f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1989f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_AUTO: 1990bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 1991bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 1992f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1993f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 1994f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 1995f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, 1996f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 1997f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1998f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1999f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2000f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 20013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 2002f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedAntibanding); 2003f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2004f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 20053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.sceneMode = ANDROID_CONTROL_OFF; 20063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 20073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 20083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 20093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableSceneModes = 20103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 20113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableSceneModes.count) return NO_INIT; 2012f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2013bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 2014f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = true; 2015f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool noSceneModes = false; 2016f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 2017f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 2018f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2019f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 2020f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2021f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala noSceneModes = true; 2022f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2023f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 2024f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Not in old API 2025f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2026f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2027f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 2028bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2029bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 2030f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2031f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 2032bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2033bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 2034f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2035f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 2036bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2037bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 2038f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2039f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 2040bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2041bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 2042f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2043f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 2044bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2045bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 2046f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2047f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 2048bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2049bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 2050f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2051f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 2052bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2053bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 2054f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2055f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 2056bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2057bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 2058f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2059f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 2060bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2061bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 2062f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2063f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 2064bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2065bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 2066f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2067f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 2068bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2069bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 2070f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2071f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 2072bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2073bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 2074f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2075f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 2076bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2077bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 2078f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2079f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 2080bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2081bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 2082f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2083f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 2084bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2085bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 2086f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2087f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2088f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 2089bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala __FUNCTION__, mCameraId, 2090bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala availableSceneModes.data.u8[i]); 2091f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2092f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2093f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2094f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2095f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (!noSceneModes) { 20963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 2097f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedSceneModes); 2098f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2099f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t flashAvailable = 21023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 21033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!flashAvailable.count) return NO_INIT; 2104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAeModes = 21063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 21073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAeModes.count) return NO_INIT; 2108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (flashAvailable.data.u8[0]) { 21103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.flashMode = Parameters::FLASH_MODE_AUTO; 21113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 21123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_AUTO); 21133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 21143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 21153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 21163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 21173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 21183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 2119f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 2120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (availableAeModes.data.u8[i] == 2121f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) { 21223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 21233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 2124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 21273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 2128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedFlashModes); 21293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } else { 21303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.flashMode = Parameters::FLASH_MODE_OFF; 21313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 21323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 21333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 21343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 2135f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t minFocusDistance = 21383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1); 21393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!minFocusDistance.count) return NO_INIT; 21403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 21413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAfModes = 21423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 21433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAfModes.count) return NO_INIT; 21443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 2146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Fixed-focus lens 21473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.focusMode = Parameters::FOCUS_MODE_FIXED; 21483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 21493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 21503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 21513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 2152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 21533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 21543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 21553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 21563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED); 21573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFocusModes = supportedFocusModes + "," + 21583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_INFINITY; 2159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = true; 2160bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 2161f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 2162f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 2163f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2164f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 2165f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_AUTO: 2166bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2167bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 2168f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2169f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_MACRO: 2170bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2171bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 2172f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2173f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 2174bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2175bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 2176f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2177f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 2178bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2179bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 2180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2181f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_EDOF: 2182bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2183bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 2184f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2185bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala // Not supported in old API 2186f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_OFF: 2187f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2188f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2189f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2190f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 2191f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableAfModes.data.u8[i]); 2192f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2193f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2194f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2195f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 21963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 2197f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedFocusModes); 2198f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2199f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t max3aRegions = 22013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 22023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!max3aRegions.count) return NO_INIT; 2203f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 2205f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala max3aRegions.data.i32[0]); 22063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 2207f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "(0,0,0,0,0)"); 22083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.focusingAreas.clear(); 22093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0)); 22103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 22113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFocalLengths = 22123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS); 22133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 2214f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2215f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float minFocalLength = availableFocalLengths.data.f[0]; 22163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 2217f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t sensorSize = 22193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2); 22203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!sensorSize.count) return NO_INIT; 2221f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2222f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // The fields of view here assume infinity focus, maximum wide angle 2223f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float horizFov = 180 / M_PI * 2224f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength)); 2225f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float vertFov = 180 / M_PI * 2226f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength)); 22273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 22283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 2229f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.exposureCompensation = 0; 22313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 22323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.exposureCompensation); 2233f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t exposureCompensationRange = 22353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2); 22363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 22373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 22383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 2239f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 22403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 2241f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 2242f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t exposureCompensationStep = 22443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1); 22453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 22463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 22473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 2248f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationStep.data.r[0].numerator / 2249f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 2250f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.autoExposureLock = false; 22523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 22533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 22543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 22553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2256f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.autoWhiteBalanceLock = false; 22583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 22593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 22603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 22613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2262f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 22643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 2265f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala max3aRegions.data.i32[0]); 22663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 2267f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "(0,0,0,0,0)"); 2268f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParameters.zoom = 0; 22703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM, mParameters.zoom); 22713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 2272f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t maxDigitalZoom = 22743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1); 22753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 2276f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2277f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2278f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 zoomRatios; 2279f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float zoom = 1.f; 2280f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 22816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala (NUM_ZOOM_STEPS-1); 2282f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 22836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 2284f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) zoomRatios += ","; 2285f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2286f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 2287f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala zoom += zoomIncrement; 2288f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 22893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 2290f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2291f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 22933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 22943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 22953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2296f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 2298f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "Infinity,Infinity,Infinity"); 2299f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t maxFacesDetected = 23013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1); 23023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 2303f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala maxFacesDetected.data.i32[0]); 23043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 2305f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 0); 2306f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 23089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala formatEnumToString(kRecordingFormat)); 2309f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 23113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 2312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 23143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2315f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 23173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 23183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 23193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableVideoStabilizationModes = 23203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 23213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableVideoStabilizationModes.count) return NO_INIT; 2322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 23243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 23253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2326f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 23273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 23283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 2329f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala mParamsFlattened = params.flatten(); 23323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2333f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 2334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 233561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 2336be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream() { 2337be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2338be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2339be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 2340be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Check if stream parameters have to change 2341be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint32_t currentWidth, currentHeight; 2342be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->getStreamInfo(mPreviewStreamId, 2343be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ¤tWidth, ¤tHeight, 0); 2344be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2345be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error querying preview stream info: " 2346be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2347be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2348be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2349be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (currentWidth != (uint32_t)mParameters.previewWidth || 2350be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala currentHeight != (uint32_t)mParameters.previewHeight) { 23519e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d", 23529e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId, currentWidth, currentHeight, 23539e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala mParameters.previewWidth, mParameters.previewHeight); 2354be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->waitUntilDrained(); 2355be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2356be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error waiting for preview to drain: " 2357be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2358be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2359be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2360be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->deleteStream(mPreviewStreamId); 2361be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2362be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 2363be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "for preview: %s (%d)", __FUNCTION__, mCameraId, 2364be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2365be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2366be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2367be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewStreamId = NO_STREAM; 2368be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2369be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2370be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2371be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewStreamId == NO_STREAM) { 2372be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->createStream(mPreviewWindow, 2373be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mParameters.previewWidth, mParameters.previewHeight, 2374be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, 2375be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mPreviewStreamId); 2376be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2377be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)", 2378be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 2379be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2380be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2381be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2382be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2383c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = mDevice->setStreamTransform(mPreviewStreamId, 2384c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mParameters.previewTransform); 2385c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (res != OK) { 2386c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview stream transform: " 2387c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2388c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return res; 2389c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 2390c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 2391be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 2392be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2393be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 23946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest() { 2395a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 23966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 23976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mPreviewRequest == NULL) { 23986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 23996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &mPreviewRequest); 24006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 24016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default preview request: " 24026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 24036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 24046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 24056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2406be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2407be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateRequestCommon(mPreviewRequest); 2408be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2409be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of preview " 2410be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 2411be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2412be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2413be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2414be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 24156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 24166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 24176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 2418d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::updateCaptureStream() { 2419be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2420d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 2421d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Find out buffer size for JPEG 2422d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_entry_t maxJpegSize = 2423d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala staticInfo(ANDROID_JPEG_MAX_SIZE); 2424d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (maxJpegSize.count == 0) { 2425d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!", 2426d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 2427d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 2428d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2429d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2430d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureConsumer == 0) { 2431d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Create CPU buffer queue endpoint 2432d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer = new CpuConsumer(1); 2433d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this)); 2434d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer")); 2435d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureWindow = new SurfaceTextureClient( 2436d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->getProducerInterface()); 2437d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Create memory for API consumption 24389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1, 24399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "Camera2Client::CaptureHeap"); 24409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mCaptureHeap->mHeap->getSize() == 0) { 2441d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for capture", 2442d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 2443d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return NO_MEMORY; 2444d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2445d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2446d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2447be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mCaptureStreamId != NO_STREAM) { 2448d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Check if stream parameters have to change 2449d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t currentWidth, currentHeight; 2450d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->getStreamInfo(mCaptureStreamId, 2451d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ¤tWidth, ¤tHeight, 0); 2452d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2453d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying capture output stream info: " 2454d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2455d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2456d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2457d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (currentWidth != (uint32_t)mParameters.pictureWidth || 2458d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala currentHeight != (uint32_t)mParameters.pictureHeight) { 2459d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->deleteStream(mCaptureStreamId); 2460d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2461d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 2462d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "for capture: %s (%d)", __FUNCTION__, mCameraId, 2463d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala strerror(-res), res); 2464d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2465d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2466d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId = NO_STREAM; 2467d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2468d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2469be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2470be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mCaptureStreamId == NO_STREAM) { 2471be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Create stream for HAL production 2472be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->createStream(mCaptureWindow, 2473be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mParameters.pictureWidth, mParameters.pictureHeight, 2474be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0], 2475be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mCaptureStreamId); 2476be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2477be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for capture: " 2478be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2479be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2480be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2481be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2482be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2483d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 2484d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 2485be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2486d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest() { 2487d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 2488d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 2489d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureRequest == NULL) { 2490d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE, 2491d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala &mCaptureRequest); 2492d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2493d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 2494d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2495d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2496d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2497d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2498be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2499be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateRequestCommon(mCaptureRequest); 2500be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2501be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 2502be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 2503be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2504be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2505be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2506be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2507be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2508be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_THUMBNAIL_SIZE, 2509be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mParameters.jpegThumbSize, 2); 2510be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2511be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2512be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_THUMBNAIL_QUALITY, 2513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mParameters.jpegThumbQuality, 1); 2514be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2516be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_QUALITY, 2517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mParameters.jpegQuality, 1); 2518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_ORIENTATION, 2521be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mParameters.jpegRotation, 1); 2522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2523be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2524be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mParameters.gpsEnabled) { 2525be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2526be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 2527be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mParameters.gpsCoordinates, 3); 2528be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2529be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2530be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 2531be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mParameters.gpsTimestamp, 1); 2532be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2533be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2534be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 2535be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mParameters.gpsProcessingMethod.string(), 2536be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mParameters.gpsProcessingMethod.size()); 2537be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2538be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else { 2539be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES); 2541be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2542be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2543be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP); 2544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2545be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2546be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD); 2547be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2548be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2549be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2550d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 2551d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 2552d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 25539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest() { 25549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ATRACE_CALL(); 25559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 25569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingRequest == NULL) { 25579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD, 25589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &mRecordingRequest); 25599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 25609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default recording request:" 25619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 25629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 25639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 25649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 25659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 25669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateRequestCommon(mRecordingRequest); 25679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 25689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of recording " 25699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 25709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 25719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 25729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 25739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 25749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 25759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 25769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 25779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream() { 25789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 25799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 25809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingConsumer == 0) { 25819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Create CPU buffer queue endpoint 25829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer = new CpuConsumer(1); 25839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this)); 25849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer")); 25859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingWindow = new SurfaceTextureClient( 25869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->getProducerInterface()); 25879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Allocate memory later, since we don't know buffer size until receipt 25889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 25899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 25909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 25919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Check if stream parameters have to change 25929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint32_t currentWidth, currentHeight; 25939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->getStreamInfo(mRecordingStreamId, 25949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ¤tWidth, ¤tHeight, 0); 25959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 25969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error querying recording output stream info: " 25979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 25989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 25999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (currentWidth != (uint32_t)mParameters.videoWidth || 26019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala currentHeight != (uint32_t)mParameters.videoHeight) { 26029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Should wait to be sure previous recording has finished 26039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->deleteStream(mRecordingStreamId); 26049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 26059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 26069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "for recording: %s (%d)", __FUNCTION__, mCameraId, 26079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 26089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 26099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingStreamId = NO_STREAM; 26119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 26149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingStreamId == NO_STREAM) { 26159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->createStream(mRecordingWindow, 26169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mParameters.videoWidth, mParameters.videoHeight, 26179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala kRecordingFormat, 0, &mRecordingStreamId); 26189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 26199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for recording: " 26209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 26219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 26229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 26259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 26269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 26279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2628be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(camera_metadata_t *request) { 2629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2630be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2631be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2632be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_TARGET_FPS_RANGE, mParameters.previewFpsRange, 2); 2633be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2634be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2635be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t wbMode = mParameters.autoWhiteBalanceLock ? 2636be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AWB_LOCKED : mParameters.wbMode; 2637be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2638be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AWB_MODE, &wbMode, 1); 2639be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2640be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2641be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_EFFECT_MODE, &mParameters.effectMode, 1); 2642be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2643be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2644be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_MODE, 2645be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mParameters.antibandingMode, 1); 2646be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2647be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t controlMode = 2649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala (mParameters.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ? 2650be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE; 2651be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2652be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_MODE, &controlMode, 1); 2653be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2654be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) { 2655be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2656be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_SCENE_MODE, 2657be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mParameters.sceneMode, 1); 2658be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2659be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2660be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2661be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t flashMode = ANDROID_FLASH_OFF; 2662be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t aeMode; 2663be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala switch (mParameters.flashMode) { 2664be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_OFF: 2665be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON; break; 2666be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 2667be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break; 2668be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_ON: 2669be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break; 2670be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 2671be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON; 2672be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala flashMode = ANDROID_FLASH_TORCH; 2673be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 2674be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 2675be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break; 2676be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala default: 2677be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 2678be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mCameraId, mParameters.flashMode); 2679be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return BAD_VALUE; 2680be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2681be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mParameters.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED; 2682be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2683be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2684be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_FLASH_MODE, &flashMode, 1); 2685be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2686be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2687be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_MODE, &aeMode, 1); 2688be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2689be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2690be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float focusDistance = 0; // infinity focus in diopters 2691be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t focusMode; 2692be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala switch (mParameters.focusMode) { 2693be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 2694be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 2695be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 2696be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 2697be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 2698be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusMode = mParameters.focusMode; 2699be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 2700be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 2701be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 2702be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusMode = ANDROID_CONTROL_AF_OFF; 2703be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 2704be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala default: 2705be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 2706be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mCameraId, mParameters.focusMode); 2707be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return BAD_VALUE; 2708be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2709be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2710be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); 2711be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2712be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2713be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AF_MODE, &focusMode, 1); 2714be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2715be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2716be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala size_t focusingAreasSize = mParameters.focusingAreas.size() * 5; 2717be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t *focusingAreas = new int32_t[focusingAreasSize]; 2718be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala for (size_t i = 0; i < focusingAreasSize; i += 5) { 2719be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusingAreas[i + 0] = mParameters.focusingAreas[i].left; 2720be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusingAreas[i + 1] = mParameters.focusingAreas[i].top; 2721be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusingAreas[i + 2] = mParameters.focusingAreas[i].right; 2722be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusingAreas[i + 3] = mParameters.focusingAreas[i].bottom; 2723be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusingAreas[i + 4] = mParameters.focusingAreas[i].weight; 2724be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2725be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2726be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AF_REGIONS, focusingAreas,focusingAreasSize); 2727be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2728be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala delete[] focusingAreas; 2729be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2730be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2731be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_EXP_COMPENSATION, 2732be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mParameters.exposureCompensation, 1); 2733be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2734be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2735be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala size_t meteringAreasSize = mParameters.meteringAreas.size() * 5; 2736be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t *meteringAreas = new int32_t[meteringAreasSize]; 2737be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala for (size_t i = 0; i < meteringAreasSize; i += 5) { 2738be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala meteringAreas[i + 0] = mParameters.meteringAreas[i].left; 2739be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala meteringAreas[i + 1] = mParameters.meteringAreas[i].top; 2740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala meteringAreas[i + 2] = mParameters.meteringAreas[i].right; 2741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala meteringAreas[i + 3] = mParameters.meteringAreas[i].bottom; 2742be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala meteringAreas[i + 4] = mParameters.meteringAreas[i].weight; 2743be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2744be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2745be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_REGIONS, meteringAreas, meteringAreasSize); 2746be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2747be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2748be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2749be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AWB_REGIONS, meteringAreas, meteringAreasSize); 2750be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2751be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala delete[] meteringAreas; 2752be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2753be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Need to convert zoom index into a crop rectangle. The rectangle is 2754be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // chosen to maximize its area on the sensor 2755be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2756be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t maxDigitalZoom = 2757be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM); 2758be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 2759be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala (NUM_ZOOM_STEPS-1); 2760be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomRatio = 1 + zoomIncrement * mParameters.zoom; 2761be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2762be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t activePixelArraySize = 2763be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2); 2764be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t arrayWidth = activePixelArraySize.data.i32[0]; 2765be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t arrayHeight = activePixelArraySize.data.i32[1]; 2766be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomLeft, zoomTop, zoomWidth, zoomHeight; 2767be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mParameters.previewWidth >= mParameters.previewHeight) { 2768be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomWidth = arrayWidth / zoomRatio; 2769be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomHeight = zoomWidth * 2770be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mParameters.previewHeight / mParameters.previewWidth; 2771be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else { 2772be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomHeight = arrayHeight / zoomRatio; 2773be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomWidth = zoomHeight * 2774be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mParameters.previewWidth / mParameters.previewHeight; 2775be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2776be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomLeft = (arrayWidth - zoomWidth) / 2; 2777be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomTop = (arrayHeight - zoomHeight) / 2; 2778be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2779be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth }; 2780be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2781be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_SCALER_CROP_REGION, cropRegion, 3); 2782be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2783be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2784be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // TODO: Decide how to map recordingHint, or whether just to ignore it 2785be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2786be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t vstabMode = mParameters.videoStabilization ? 2787be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_ON : 2788be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; 2789be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2790be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 2791be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &vstabMode, 1); 2792be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2793be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2794be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 2795be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2796be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2797be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateEntry(camera_metadata_t *buffer, 2798be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint32_t tag, const void *data, size_t data_count) { 2799be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t entry; 2800be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2801be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = find_camera_metadata_entry(buffer, tag, &entry); 2802be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res == NAME_NOT_FOUND) { 2803be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = add_camera_metadata_entry(buffer, 2804be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala tag, data, data_count); 2805be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else if (res == OK) { 2806be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = update_camera_metadata_entry(buffer, 2807be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala entry.index, data, data_count, NULL); 2808be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2809be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2810be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2811be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", 2812be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, get_camera_metadata_section_name(tag), 2813be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2814be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2815be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2816be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2817be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2818be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::deleteEntry(camera_metadata_t *buffer, uint32_t tag) { 2819be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t entry; 2820be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2821be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = find_camera_metadata_entry(buffer, tag, &entry); 2822be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res == NAME_NOT_FOUND) { 2823be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 2824be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else if (res != OK) { 2825be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error looking for entry %s.%s (%x): %s %d", 2826be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, 2827be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_section_name(tag), 2828be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2829be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2830be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2831be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = delete_camera_metadata_entry(buffer, entry.index); 2832be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2833be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", 2834be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, 2835be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_section_name(tag), 2836be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2837be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2838be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2839be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 28406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) { 28416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 28426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 28436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 28446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 28456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 28466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 28476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 28486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 28496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YV12 : // YV12 28506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 28516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RGB_565 : // RGB565 28526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 28536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 28546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 28556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 28566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 28576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 28586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 28593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) { 28603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char *fmt; 28613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala switch(format) { 28623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 28633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 28643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 28653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 28663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 28673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 28683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 28693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 28703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 28713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 28723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 28733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 28743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 28753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 28763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 28773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 28783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 28793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 28803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 28813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 28823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 28833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 28843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala default: 28853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 28863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala __FUNCTION__, format); 28873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = NULL; 28883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 28893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } 28903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return fmt; 28913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala} 28926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 28936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) { 28946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 28956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 28966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_AUTO : 28976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 28986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_INCANDESCENT : 28996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 29006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_FLUORESCENT : 29016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 29026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_WARM_FLUORESCENT : 29036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 29046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_DAYLIGHT : 29056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 29066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT : 29076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 29086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_TWILIGHT : 29096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 29106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_SHADE : 29116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 29126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 29136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 29146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) { 29156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 29166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 29176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_OFF : 29186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 29196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_MONO : 29206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 29216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_NEGATIVE : 29226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 29236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SOLARIZE : 29246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 29256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SEPIA : 29266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 29276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_POSTERIZE : 29286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 29296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_WHITEBOARD : 29306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 29316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_BLACKBOARD : 29326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 29336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_AQUA : 29346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 29356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 29366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 29376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) { 29386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 29396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 29406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_AUTO : 29416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 29426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_OFF : 29436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 29446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_50HZ : 29456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 29466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_60HZ : 29476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 29486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 29496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 29506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) { 29516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 29526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 29536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 29546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 29556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 29566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 29576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 29586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 29596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 29606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 29616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 29626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 29636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 29646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 29656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 29666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 29676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 29686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 29696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 29706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 29716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 29726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 29736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 29746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 29756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 29766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 29776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 29786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 29796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 29806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 29816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 29826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 29836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 29846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 29856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 29866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 29876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum( 29886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *flashMode) { 29896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 29906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 29916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 29926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 29936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 29946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 29956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_ON : 29966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 29976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 29986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 29996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 30006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 30016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum( 30046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *focusMode) { 30056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 30066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 30076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 30086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 30096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 30106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 30116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 30126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 30136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 30146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 30156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 30166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 30176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 30186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 30196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 30206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 30216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr, 30246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> *areas) { 30256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 30266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->clear(); 30276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areasCStr == NULL) { 30286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 30296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->push(); 30306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 30316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 30326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala String8 areasStr(areasCStr); 30336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 30346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala while (areaStart != 0) { 30356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 30366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala char *numEnd; 30376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int vals[NUM_FIELDS]; 30386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 30396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 30406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 30416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 30426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala area = numEnd + 1; 30436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 30446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->push(Parameters::Area( 30456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 30466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 30476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 30486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 30496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas, 30526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t maxRegions) { 30536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Definition of valid area can be found in 30546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // include/camera/CameraParameters.h 30556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 30566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() == 1) { 30576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas[0].left == 0 && 30586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].top == 0 && 30596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].right == 0 && 30606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].bottom == 0 && 30616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].weight == 0) { 30626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 30636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 30646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 30656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 30666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() > maxRegions) { 30676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Too many areas requested: %d", 30686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, areas.size()); 30696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 30706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 30716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 30736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala a != areas.end(); a++) { 30746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 30756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 30766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 30776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 30786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 30796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 30806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 30816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 30826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 30836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) { 30866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return !boolStr ? false : 30876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 30886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala false; 30896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 3091c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalaint Camera2Client::degToTransform(int degrees, bool mirror) { 3092c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (!mirror) { 3093c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (degrees == 0) return 0; 3094c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 3095c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 3096c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 3097c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 3098c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 3099c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 3100c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 3101c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 3102c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 3103c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 3104c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 3105c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 3106c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 3107c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 3108c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 3109c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return -1; 3110c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 31116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 311261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android 3113