Camera2Client.cpp revision 836b81f3c5a5bacb800f698f90ded6bd6e6bc5ce
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> 2778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala#include <media/hardware/MetadataBufferType.h> 2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 29f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <math.h> 30f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Client.h" 3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android { 3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); 3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); 3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() { 3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return IPCThreadState::self()->getCallingPid(); 4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingUid() { 4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return IPCThreadState::self()->getCallingUid(); 4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService 4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService, 4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala const sp<ICameraClient>& cameraClient, 5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int cameraId, 5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int cameraFacing, 5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int clientPid): 5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala Client(cameraService, cameraClient, 54f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala cameraId, cameraFacing, clientPid), 556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState(NOT_INITIALIZED), 56d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mPreviewStreamId(NO_STREAM), 57d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mPreviewRequest(NULL), 58d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId(NO_STREAM), 599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureRequest(NULL), 609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingStreamId(NO_STREAM), 619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingRequest(NULL) 62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 63a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice = new Camera2Device(cameraId); 66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module) 69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 70a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 719e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = mDevice->initialize(module); 75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = buildDefaultParameters(); 82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (gLogLevel >= 1) { 89836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCameraId); 92836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ALOGD("%s", k.mParameters.paramsFlattened.string()); 93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = STOPPED; 966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 9861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 9961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 10061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() { 101a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1024ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId); 1034ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDestructionStarted = true; 105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala disconnect(); 1073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 10861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 10961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 11061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) { 111611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala String8 result; 1123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", 113611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mCameraId, 114611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala getCameraClient()->asBinder().get(), 115611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mClientPid); 1167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" State: "); 1177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 1187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 119836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const Parameters& p = mParameters.unsafeUnlock(); 120836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1214ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append(getStateName(mState)); 1227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1234ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append("\n Current parameters:\n"); 1247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview size: %d x %d\n", 125836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewWidth, p.previewHeight); 1267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview FPS range: %d - %d\n", 127836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFpsRange[0], p.previewFpsRange[1]); 1287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview HAL pixel format: 0x%x\n", 129836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFormat); 13011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala result.appendFormat(" Preview transform: %x\n", 131836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewTransform); 1327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Picture size: %d x %d\n", 133836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.pictureWidth, p.pictureHeight); 1347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 135836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegThumbSize[0], p.jpegThumbSize[1]); 1367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 137836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegQuality, p.jpegThumbQuality); 138836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation); 1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS tags %s\n", 140836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsEnabled ? "enabled" : "disabled"); 141836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (p.gpsEnabled) { 1427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 143836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[0], p.gpsCoordinates[1], 144836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[2]); 1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS timestamp: %lld\n", 146836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsTimestamp); 1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS processing method: %s\n", 148836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsProcessingMethod.string()); 1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" White balance mode: "); 152836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.wbMode) { 1537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO) 1547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT) 1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT) 1567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT) 1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT) 1587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT) 1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT) 1607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE) 1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Effect mode: "); 165836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.effectMode) { 1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF) 1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO) 1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE) 1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE) 1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA) 1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE) 1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD) 1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD) 1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA) 1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Antibanding mode: "); 179836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.antibandingMode) { 1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO) 1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF) 1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ) 1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ) 1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Scene mode: "); 188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.sceneMode) { 1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append("AUTO\n"); break; 1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Flash mode: "); 210836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.flashMode) { 2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focus mode: "); 221836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.focusMode) { 2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focusing areas:\n"); 234836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.focusingAreas.size(); i++) { 2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 236836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].left, 237836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].top, 238836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].right, 239836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].bottom, 240836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].weight); 2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Exposure compensation index: %d\n", 244836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.exposureCompensation); 2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" AE lock %s, AWB lock %s\n", 247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoExposureLock ? "enabled" : "disabled", 248836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoWhiteBalanceLock ? "enabled" : "disabled" ); 2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Metering areas:\n"); 251836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.meteringAreas.size(); i++) { 2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 253836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].left, 254836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].top, 255836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].right, 256836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].bottom, 257836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].weight); 2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 260836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Zoom index: %d\n", p.zoom); 261836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Video size: %d x %d\n", p.videoWidth, 262836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoHeight); 2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2643297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Recording hint is %s\n", 265836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.recordingHint ? "set" : "not set"); 2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Video stabilization is %s\n", 268836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoStabilization ? "enabled" : "disabled"); 2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current streams:\n"); 2713297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Preview stream ID: %d\n", mPreviewStreamId); 2723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Capture stream ID: %d\n", mCaptureStreamId); 273836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Recording stream ID: %d\n", mRecordingStreamId); 2743297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current requests:\n"); 2763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mPreviewRequest != NULL) { 2773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Preview request:\n"); 2783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala dump_camera_metadata(mPreviewRequest, fd, 2); 2803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 2813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Preview request: undefined\n"); 2823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 2843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mCaptureRequest != NULL) { 2863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Capture request:\n"; 2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala dump_camera_metadata(mCaptureRequest, fd, 2); 2893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 2903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Capture request: undefined\n"; 2913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Device dump:\n"; 295611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala write(fd, result.string(), result.size()); 2967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t res = mDevice->dump(fd, args); 2983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (res != OK) { 2993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Error dumping device: %s (%d)", 3003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala strerror(-res), res); 3013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 3023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 3037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM 305611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala return NO_ERROR; 30661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 30761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3084ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) { 3094ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 3104ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala switch(state) { 3114ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(NOT_INITIALIZED) 3124ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 3134ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 3144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 3154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 3164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 3174ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 3184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala default: 3194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return "Unknown state!"; 3204ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala break; 3214ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 3224ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR 3234ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala} 3244ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 32561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface 32661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 32761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() { 328a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3299e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 330ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 331ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 332f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mDevice == 0) return; 333f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 334ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala stopPreviewLocked(); 3356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 336d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->waitUntilDrained(); 337d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 338d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 3396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mDevice->deleteStream(mPreviewStreamId); 340d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mPreviewStreamId = NO_STREAM; 341d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 342d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 343d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureStreamId != NO_STREAM) { 344d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->deleteStream(mCaptureStreamId); 345d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId = NO_STREAM; 3466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 347f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 348898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 349898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala mDevice->deleteStream(mRecordingStreamId); 350898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala mRecordingStreamId = NO_STREAM; 351898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala } 352898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 35361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala CameraService::Client::disconnect(); 35461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 35561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 35661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) { 357a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3589e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 359ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 360ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 3619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != 0 && getCallingPid() != mClientPid) { 3629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Connection attempt from pid %d; " 3639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "current locked to pid %d", __FUNCTION__, 3649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraId, getCallingPid(), mClientPid); 3659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return BAD_VALUE; 3669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 3679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 3699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient = client; 3709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 37261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 37361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 37461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() { 375a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3769e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 377ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 3789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 3799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 380ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 3819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == 0) { 3829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 3839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 3849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 3859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != getCallingPid()) { 3879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 3889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 3899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 3909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 3919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 39361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 39461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 39561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() { 396a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3979e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 398ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 3999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 4009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 401ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Check for uninterruptable conditions 4039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == getCallingPid()) { 4059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = 0; 4069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient.clear(); 4079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 4119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 41361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 41461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay( 4166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<Surface>& surface) { 417a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4189e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 419ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 420ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surface != 0) { 4246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surface->asBinder(); 4256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = surface; 4266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 428d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return setPreviewWindowLocked(binder,window); 42961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 43061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture( 4326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<ISurfaceTexture>& surfaceTexture) { 433a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4349e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 435ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 436ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surfaceTexture != 0) { 4406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surfaceTexture->asBinder(); 4416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = new SurfaceTextureClient(surfaceTexture); 4426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 443d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return setPreviewWindowLocked(binder, window); 4446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 4456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 446d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder, 447be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala sp<ANativeWindow> window) { 448a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 4506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (binder == mPreviewSurface) { 4529e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: New window is same as old window", 4539e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId); 4546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return NO_ERROR; 4556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 4589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case NOT_INITIALIZED: 4599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STILL_CAPTURE: 4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK 4689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Already running preview - need to stop and create a new stream 4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Optimize this so that we don't wait for old stream to drain 4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // before spinning up new stream 4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mDevice->setStreamingRequest(NULL); 4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = WAITING_FOR_PREVIEW_WINDOW; 4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 4769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 478d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 479be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->waitUntilDrained(); 480be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 481be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error waiting for preview to drain: %s (%d)", 482be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 483be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 484be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->deleteStream(mPreviewStreamId); 4866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 487be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Unable to delete old preview stream: %s (%d)", 488be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 4896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 4906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 491be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewStreamId = NO_STREAM; 4926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 494bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala mPreviewSurface = binder; 495be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewWindow = window; 496bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 4976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState == WAITING_FOR_PREVIEW_WINDOW) { 498d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return startPreviewLocked(); 4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 50261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 50361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 50461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) { 505a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 506ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 50761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 50861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 50961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() { 510a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5119e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 512ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 513d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return startPreviewLocked(); 514d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 515ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 516d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::startPreviewLocked() { 517d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 5186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 5194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (mState >= PREVIEW) { 5204ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGE("%s: Can't start preview in state %s", 5214ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala __FUNCTION__, getStateName(mState)); 5224ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return INVALID_OPERATION; 5234ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 525be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewWindow == 0) { 5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = WAITING_FOR_PREVIEW_WINDOW; 5276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 5286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 529be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mState = STOPPED; 5306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 531836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 5329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 533836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updatePreviewStream(k.mParameters); 534be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 535be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 536be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 537be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 5386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewRequest == NULL) { 541836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updatePreviewRequest(k.mParameters); 542be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 543be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)", 544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 545be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 546be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 5476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 549be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mPreviewRequest, 550be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 551be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mPreviewStreamId, 1); 5526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)", 5546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 555be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 556be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 557be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = sort_camera_metadata(mPreviewRequest); 558be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 559be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)", 560be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 5616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 5626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 5656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 566bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview request to start preview: " 567bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala "%s (%d)", 5686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 5696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 5706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = PREVIEW; 5726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 57461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 57561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 57661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() { 577a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5789e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 579ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 580ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala stopPreviewLocked(); 581ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala} 582ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 583ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvalavoid Camera2Client::stopPreviewLocked() { 584ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala ATRACE_CALL(); 585d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 586d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case NOT_INITIALIZED: 587d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Call before initialized", 588d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 589d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 590d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STOPPED: 591d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 592d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot stop preview during still capture.", 594d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 595d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 596d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 597d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Handle record stop here 598d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 599d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->setStreamingRequest(NULL); 6002267106c98f461b730c772a913da946c391a178cEino-Ville Talvala mDevice->waitUntilDrained(); 601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 602d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STOPPED; 603d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 604d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 605d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 606d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState); 607d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 60861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 60961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 61061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() { 611a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 612ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return mState == PREVIEW; 61461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 61561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 61661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 617a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 618ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 61978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala switch (mState) { 62078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala case RECORD: 62178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala case VIDEO_SNAPSHOT: 62278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Can't be called in state %s", 62378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 62478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 62578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala default: 62678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala // OK 62778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala break; 62878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 629836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 63078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 631836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.storeMetadataInBuffers = enabled; 63278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 63378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return OK; 63461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 63561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 63661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() { 637a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6389e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 639ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 6419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 6429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 6439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = startPreviewLocked(); 6449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) return res; 6459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 6479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Ready to go 6489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 6509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 6519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to call this when recording is already on 6529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 6539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 6559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't start recording in state %s", 6569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 6579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 6589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 6599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 660836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 6619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 662836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (!k.mParameters.storeMetadataInBuffers) { 66378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording only supported in metadata mode, but " 66478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "non-metadata recording mode requested!", __FUNCTION__, 66578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mCameraId); 66678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 66778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 66878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 669836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRecordingStream(k.mParameters); 6709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 6719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 6729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 6749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 6769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingRequest == NULL) { 677836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRecordingRequest(k.mParameters); 6789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 6799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)", 6809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 6829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 6859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId }; 6869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mRecordingRequest, 6879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 6889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala outputStreams, 2); 6899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 6909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)", 6919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 6939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = sort_camera_metadata(mRecordingRequest); 6959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 6969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)", 6979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 6999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mRecordingRequest); 7029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set recording request to start " 7049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "recording: %s (%d)", __FUNCTION__, mCameraId, 7059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 7069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = RECORD; 7099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 71161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 71261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 71361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() { 714a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 7159e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 716ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 7189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 7199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 7209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to stop 7219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 7229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 7239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 7249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STILL_CAPTURE: 7259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 7269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 7279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop recording in state %s", 7289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 7299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 7309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 7319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Back to preview. Since record can only be reached through preview, 7339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // all preview stream setup should be up to date. 7349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 7359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to switch back to preview request: " 7379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 7389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 7399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Should recording heap be freed? Can't do it yet since requests 7429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // could still be in flight. 7439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = PREVIEW; 74561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 74661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 74761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() { 748a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 749ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return (mState == RECORD || mState == VIDEO_SNAPSHOT); 75161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 75261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 75361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 754a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 755ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Make sure this is for the current heap 7579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ssize_t offset; 7589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size; 75978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala status_t res; 7609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 7619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) { 7629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release " 7639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "(got %x, expected %x)", __FUNCTION__, mCameraId, 7649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala heap->getHeapID(), mRecordingHeap->mHeap->getHeapID()); 7659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 7669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 76778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint8_t *data = (uint8_t*)heap->getBase() + offset; 76878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint32_t type = *(uint32_t*)data; 76978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (type != kMetadataBufferTypeGrallocSource) { 77078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)", 77178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource); 77278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return; 77378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 77478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala buffer_handle_t imgBuffer = *(buffer_handle_t*)(data + 4); 77578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId, 776803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala imgBuffer); 77778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala res = mRecordingConsumer->freeBuffer(imgBuffer); 77878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (res != OK) { 77978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):" 78078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "%s (%d)", 78178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala __FUNCTION__, mCameraId, imgBuffer, strerror(-res), res); 78278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return; 78378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 78478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 7859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree++; 78661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 78761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 78861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() { 789a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 790ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 79261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 79361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 79461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() { 795a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 796ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 79861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 79961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 80061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) { 801a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 802ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 803d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 804d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 805d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 806d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case NOT_INITIALIZED: 807d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STOPPED: 808d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 809d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 810d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 811d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 812d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 813d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 814d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Good to go for takePicture 815d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 816d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 817d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case VIDEO_SNAPSHOT: 818d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Already taking a picture", 819d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 820d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 821d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 822d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 823836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 824d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 825836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateCaptureStream(k.mParameters); 8264ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 827be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 828be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 8294ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 8304ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 831d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 832d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureRequest == NULL) { 833836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateCaptureRequest(k.mParameters); 8344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 835be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't create still image capture request: " 836be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 8374ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 8384ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 839d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 840d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 841d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_entry_t outputStreams; 8429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState == PREVIEW) { 8439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId }; 8449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS, 8459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &streamIds, 2); 8469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } else if (mState == RECORD) { 8479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId, 8489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureStreamId }; 8499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS, 8509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &streamIds, 3); 8519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 8529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 853d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 854d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still image capture request: " 855d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 856d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 858d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 859be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = sort_camera_metadata(mCaptureRequest); 860be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 861be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)", 862be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 863be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 864be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 865d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 866d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest); 867d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (captureCopy == NULL) { 868d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 869d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 870d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return NO_MEMORY; 871d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 872d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 873d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mState == PREVIEW) { 874d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->setStreamingRequest(NULL); 875d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 876d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 877d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 878d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 879d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 880d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 881d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 8829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 883d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->capture(captureCopy); 884d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 885d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 886d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 887d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 888d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 889d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 890d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 891d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 892d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 893d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STILL_CAPTURE; 894d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 895d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 896d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = VIDEO_SNAPSHOT; 897d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 898d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 899d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state for still capture!", 900d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 901d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 902d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 903d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 904d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 90561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 90661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 90761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) { 908a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 9099e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 910ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 911836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 9126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala status_t res; 9136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala CameraParameters newParams(params); 9156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only 9176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // parameters such as supported preview sizes, etc. Should probably 9186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // produce an error if they're changed. 9196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala /** Extract and verify new parameters */ 9216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t i; 9236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_SIZE 9256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int previewWidth, previewHeight; 9266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getPreviewSize(&previewWidth, &previewHeight); 9276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 928836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewWidth != k.mParameters.previewWidth || 929836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala previewHeight != k.mParameters.previewHeight) { 9306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState >= PREVIEW) { 9316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 9329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 9339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, 934836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth, k.mParameters.previewHeight, 9359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala previewWidth, previewHeight); 9366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePreviewSizes = 9396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 9406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePreviewSizes.count; i += 2 ) { 9416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availablePreviewSizes.data.i32[i] == previewWidth && 9426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availablePreviewSizes.data.i32[i+1] == previewHeight) break; 9436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePreviewSizes.count) { 9456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 9466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, previewWidth, previewHeight); 9476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FPS_RANGE 95211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int previewFpsRange[2]; 95311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int previewFps = 0; 9546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool fpsRangeChanged = false; 95511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]); 956836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFpsRange[0] != k.mParameters.previewFpsRange[0] || 957836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala previewFpsRange[1] != k.mParameters.previewFpsRange[1]) { 9586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala fpsRangeChanged = true; 9596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePreviewFpsRanges = 9606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 9616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 9626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 96311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[0]) && 9646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 96511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1]) ) { 9666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala break; 9676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 9706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 97111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala __FUNCTION__, previewFpsRange[0], previewFpsRange[1]); 9726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 97411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFps = previewFpsRange[0]; 9756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FORMAT 9786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int previewFormat = formatStringToEnum(newParams.getPreviewFormat()); 979836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFormat != k.mParameters.previewFormat) { 9806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState >= PREVIEW) { 9816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 9826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "is active!", __FUNCTION__); 9836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFormats = 9866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 9876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFormats.count; i++) { 9886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableFormats.data.i32[i] == previewFormat) break; 9896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFormats.count) { 9916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 9926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), previewFormat); 9936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FRAME_RATE 9986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Deprecated, only use if the preview fps range is unchanged this time. 9996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // The single-value FPS is the same as the minimum of the range. 10006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (!fpsRangeChanged) { 10016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala previewFps = newParams.getPreviewFrameRate(); 1002836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFps != k.mParameters.previewFps) { 10036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFrameRates = 10046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 10056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 10066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableFrameRates.data.i32[i] == previewFps) break; 10076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFrameRates.count) { 10096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 10106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, previewFps); 10116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 101311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[0] = availableFrameRates.data.i32[i]; 101411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1] = availableFrameRates.data.i32[i+1]; 10156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PICTURE_SIZE 10196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int pictureWidth, pictureHeight; 10206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getPictureSize(&pictureWidth, &pictureHeight); 1021836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (pictureWidth == k.mParameters.pictureWidth || 1022836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala pictureHeight == k.mParameters.pictureHeight) { 10236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePictureSizes = 10246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 10256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePictureSizes.count; i+=2) { 10266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availablePictureSizes.data.i32[i] == pictureWidth && 10276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availablePictureSizes.data.i32[i+1] == pictureHeight) break; 10286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePictureSizes.count) { 10306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 10316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, pictureWidth, pictureHeight); 10326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 103711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int jpegThumbSize[2]; 103811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[0] = 10396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 104011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[1] = 10416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 1042836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (jpegThumbSize[0] != k.mParameters.jpegThumbSize[0] || 1043836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala jpegThumbSize[1] != k.mParameters.jpegThumbSize[1]) { 10446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableJpegThumbSizes = 10456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 10466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 104711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] && 104811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) { 10496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala break; 10506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 10536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 105411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]); 10556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 10606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegThumbQuality = 10616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 10626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegThumbQuality < 0 || jpegThumbQuality > 100) { 10636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 10646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegThumbQuality); 10656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_QUALITY 10696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegQuality = 10706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 10716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegQuality < 0 || jpegQuality > 100) { 10726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 10736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegQuality); 10746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ROTATION 10786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegRotation = 10796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 10806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegRotation != 0 && 10816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 90 && 10826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 180 && 10836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 270) { 10846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 10856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegRotation); 10866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // GPS 10906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool gpsEnabled = false; 109111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala double gpsCoordinates[3] = {0,0,0}; 10926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int64_t gpsTimestamp = 0; 10936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala String8 gpsProcessingMethod; 10946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsLatStr = 10956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 10966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (gpsLatStr != NULL) { 10976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsLongStr = 10986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 10996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsAltitudeStr = 11006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 11016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsTimeStr = 11026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 11036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsProcMethodStr = 11046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 11056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (gpsLongStr == NULL || 11066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsAltitudeStr == NULL || 11076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsTimeStr == NULL || 11086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsProcMethodStr == NULL) { 11096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 11106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__); 11116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala char *endPtr; 11146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 111511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 11166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 11176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 11186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 112111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 11236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 11246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 112711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 11286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 11296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 11306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsAltitudeStr); 11316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 11346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 11356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 11366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 11376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsProcessingMethod = gpsProcMethodStr; 11406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsEnabled = true; 11426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // WHITE_BALANCE 11456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int wbMode = wbModeStringToEnum( 11466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 1147836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (wbMode != k.mParameters.wbMode) { 11486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableWbModes = 11496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 11506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 11516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (wbMode == availableWbModes.data.u8[i]) break; 11526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableWbModes.count) { 11546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 11556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 11566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 11576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // EFFECT 11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int effectMode = effectModeStringToEnum( 11636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 1164836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (effectMode != k.mParameters.effectMode) { 11656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableEffectModes = 11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (effectMode == availableEffectModes.data.u8[i]) break; 11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableEffectModes.count) { 11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 11726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 11746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ANTIBANDING 11796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int antibandingMode = abModeStringToEnum( 11806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 1181836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (antibandingMode != k.mParameters.antibandingMode) { 11826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableAbModes = 11836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 11846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 11856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (antibandingMode == availableAbModes.data.u8[i]) break; 11866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableAbModes.count) { 11886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 11896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 11906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 11916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // SCENE_MODE 11966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int sceneMode = sceneModeStringToEnum( 11976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 1198836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (sceneMode != k.mParameters.sceneMode) { 11996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableSceneModes = 12006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 12016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 12026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (sceneMode == availableSceneModes.data.u8[i]) break; 12036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableSceneModes.count) { 12056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 12066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 12086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FLASH_MODE 12136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::flashMode_t flashMode = flashModeStringToEnum( 12146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 1215836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (flashMode != k.mParameters.flashMode) { 12166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t flashAvailable = 12176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 12186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (!flashAvailable.data.u8[0] && 12196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala flashMode != Parameters::FLASH_MODE_OFF) { 12206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 12216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "No flash on device", __FUNCTION__, 12226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 12236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) { 12256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableAeModes = 12266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 12276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 12286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (flashMode == availableAeModes.data.u8[i]) break; 12296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableAeModes.count) { 12316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 12326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 12346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (flashMode == -1) { 12376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 12386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 12406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FOCUS_MODE 12456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::focusMode_t focusMode = focusModeStringToEnum( 12466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 1247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (focusMode != k.mParameters.focusMode) { 12486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode != Parameters::FOCUS_MODE_FIXED) { 12496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t minFocusDistance = 12506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE); 12516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 12526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 12536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "fixed focus lens", 12546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 12566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) { 12586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFocusModes = 12596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 12606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 12616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode == availableFocusModes.data.u8[i]) break; 12626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFocusModes.count) { 12646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 12656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 12676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FOCUS_AREAS 12746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> focusingAreas; 12756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 12766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala &focusingAreas); 12776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t max3aRegions = 12786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 12806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res != OK) { 12816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 12826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // EXPOSURE_COMPENSATION 12876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int exposureCompensation = 12886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 12896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t exposureCompensationRange = 12906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE); 12916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (exposureCompensation < exposureCompensationRange.data.i32[0] || 12926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala exposureCompensation > exposureCompensationRange.data.i32[1]) { 12936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 12946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, exposureCompensation); 12956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // AUTO_EXPOSURE_LOCK (always supported) 12996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool autoExposureLock = boolFromString( 13006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 13016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // AUTO_WHITEBALANCE_LOCK (always supported) 13036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool autoWhiteBalanceLock = boolFromString( 13046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 13056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // METERING_AREAS 13076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> meteringAreas; 13086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 13096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala &meteringAreas); 13106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 13116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res != OK) { 13126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 13136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 13146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 13156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ZOOM 13196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 13206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) { 13216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested zoom level %d is not supported", 13226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, zoom); 13236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // VIDEO_SIZE 13276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int videoWidth, videoHeight; 13286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getVideoSize(&videoWidth, &videoHeight); 1329836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (videoWidth != k.mParameters.videoWidth || 1330836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala videoHeight != k.mParameters.videoHeight) { 13316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState == RECORD) { 13326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Video size cannot be updated when recording is active!", 13336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__); 13346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableVideoSizes = 13376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 13386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableVideoSizes.count; i += 2 ) { 13396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableVideoSizes.data.i32[i] == videoWidth && 13406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availableVideoSizes.data.i32[i+1] == videoHeight) break; 13416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableVideoSizes.count) { 13436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested video size %d x %d is not supported", 13446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, videoWidth, videoHeight); 13456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // RECORDING_HINT (always supported) 13506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool recordingHint = boolFromString( 13516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 13526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // VIDEO_STABILIZATION 13546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool videoStabilization = boolFromString( 13556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 13566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableVideoStabilizationModes = 13576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 13586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (videoStabilization && availableVideoStabilizationModes.count == 1) { 13596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 13606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala /** Update internal parameters */ 13639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1364836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth = previewWidth; 1365836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewHeight = previewHeight; 1366836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0] = previewFpsRange[0]; 1367836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1] = previewFpsRange[1]; 1368836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFps = previewFps; 1369836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFormat = previewFormat; 1370836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1371836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureWidth = pictureWidth; 1372836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight = pictureHeight; 1373836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1374836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0] = jpegThumbSize[0]; 1375836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1] = jpegThumbSize[1]; 1376836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality = jpegQuality; 1377836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality = jpegThumbQuality; 1378836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1379836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsEnabled = gpsEnabled; 1380836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[0] = gpsCoordinates[0]; 1381836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[1] = gpsCoordinates[1]; 1382836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[2] = gpsCoordinates[2]; 1383836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsTimestamp = gpsTimestamp; 1384836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsProcessingMethod = gpsProcessingMethod; 1385836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1386836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.wbMode = wbMode; 1387836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.effectMode = effectMode; 1388836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.antibandingMode = antibandingMode; 1389836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.sceneMode = sceneMode; 1390836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1391836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = flashMode; 1392836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = focusMode; 1393836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1394836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas = focusingAreas; 1395836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation = exposureCompensation; 1396836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoExposureLock = autoExposureLock; 1397836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock; 1398836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.meteringAreas = meteringAreas; 1399836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.zoom = zoom; 1400836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1401836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoWidth = videoWidth; 1402836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoHeight = videoHeight; 1403836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1404836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.recordingHint = recordingHint; 1405836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoStabilization = videoStabilization; 1406836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1407836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updatePreviewRequest(k.mParameters); 1408be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1409be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 1410be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1411be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1412be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 1413836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateCaptureRequest(k.mParameters); 1414be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1415be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)", 1416be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1417be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1418be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 1419be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 1420836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRecordingRequest(k.mParameters); 14219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 14229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 14239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 14249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 14259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 14269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1427be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mState == PREVIEW) { 1428be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 1429be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1430be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 1431be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1432be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1433be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 14349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } else if (mState == RECORD || mState == VIDEO_SNAPSHOT) { 14359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mRecordingRequest); 14369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 14379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 14389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 14399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 14409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 1441be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 14426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 1443836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.paramsFlattened = params; 14449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 14456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 144661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 1447f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 144861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const { 1449a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1450ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 1451ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 1452836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::ReadKey k(mParameters); 1453ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 14543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala // TODO: Deal with focus distances 1455836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala return k.mParameters.paramsFlattened; 145661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 145761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 145861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1459a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1460ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 1461c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1462c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1463c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala cmd, arg1, arg2); 1464c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1465c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (cmd == CAMERA_CMD_SET_DISPLAY_ORIENTATION) { 1466836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 1467c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala int transform = degToTransform(arg1, 1468c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 1469c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (transform == -1) { 1470c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as display orientation value", 1471c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala __FUNCTION__, mCameraId, arg1); 1472c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 1473c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1474836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (transform != k.mParameters.previewTransform && 1475c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mPreviewStreamId != NO_STREAM) { 1476c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mDevice->setStreamTransform(mPreviewStreamId, transform); 1477c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1478836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewTransform = transform; 1479c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return OK; 1480c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1481c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1482c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unimplemented command %d (%d, %d)", __FUNCTION__, 1483c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraId, cmd, arg1, arg2); 1484c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 14856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 148661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 148761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 14883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */ 14893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1490d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() { 1491d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 1492d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 1493d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala sp<ICameraClient> currentClient; 14949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId); 14959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1496d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala CpuConsumer::LockedBuffer imgBuffer; 1497d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala { 1498d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 1499d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1500d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Signal errors here upstream 1501d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) { 1502d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly!", 1503d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 1504d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1505d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1506d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1507d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mCaptureConsumer->lockNextBuffer(&imgBuffer); 1508d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1509d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)", 1510d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1511d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1512d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1513d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1514d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) { 1515d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected format for still image: " 1516d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%x, expected %x", __FUNCTION__, mCameraId, 1517d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala imgBuffer.format, 1518d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala HAL_PIXEL_FORMAT_BLOB); 1519d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 1520d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1521d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1522d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1523d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Optimize this to avoid memcopy 15249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala void* captureMemory = mCaptureHeap->mHeap->getBase(); 15259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size = mCaptureHeap->mHeap->getSize(); 1526d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala memcpy(captureMemory, imgBuffer.data, size); 1527d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1528d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 1529d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1530d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala currentClient = mCameraClient; 1531d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 1532d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 1533d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STOPPED; 1534d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1535d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case VIDEO_SNAPSHOT: 1536d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = RECORD; 1537d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1538d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 1539d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__, 1540d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCameraId, mState); 1541d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1542d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1543d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1544d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Call outside mICameraLock to allow re-entrancy from notification 1545d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (currentClient != 0) { 1546d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 15479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureHeap->mBuffers[0], NULL); 15489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 15509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() { 15529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ATRACE_CALL(); 15539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 15549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<ICameraClient> currentClient; 15559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t heapIdx = 0; 15569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala nsecs_t timestamp; 15579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala { 15589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala Mutex::Autolock icl(mICameraLock); 15599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Signal errors here upstream 1560898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala bool discardData = false; 15619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RECORD && mState != VIDEO_SNAPSHOT) { 1562898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala ALOGV("%s: Camera %d: Discarding recording image buffers received after " 1563898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala "recording done", 15649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 1565898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala discardData = true; 15669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 156878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala buffer_handle_t imgBuffer; 156978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala res = mRecordingConsumer->getNextBuffer(&imgBuffer, ×tamp); 15709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 15719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)", 15729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 15749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1576898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala if (discardData) { 157778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mRecordingConsumer->freeBuffer(imgBuffer); 15789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 15799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 1580898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 158178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (mRecordingHeap == 0) { 158278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala const size_t bufferSize = 4 + sizeof(buffer_handle_t); 15839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Creating recording heap with %d buffers of " 15849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "size %d bytes", __FUNCTION__, mCameraId, 15859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala kRecordingHeapCount, bufferSize); 15869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingHeap != 0) { 15879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Previous heap has size %d " 15889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "(new will be %d) bytes", __FUNCTION__, mCameraId, 15899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mHeap->getSize(), 15909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala bufferSize * kRecordingHeapCount); 15919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Need to allocate memory for heap 15939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap.clear(); 15949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap = new Camera2Heap(bufferSize, kRecordingHeapCount, 15969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "Camera2Client::RecordingHeap"); 15979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingHeap->mHeap->getSize() == 0) { 15989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for recording", 15999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 160078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mRecordingConsumer->freeBuffer(imgBuffer); 16019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 16029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapHead = 0; 16049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree = kRecordingHeapCount; 16059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 16079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if ( mRecordingHeapFree == 0) { 16089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: No free recording buffers, dropping frame", 16099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 161078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mRecordingConsumer->freeBuffer(imgBuffer); 16119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 16129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala heapIdx = mRecordingHeapHead; 16149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapHead = (mRecordingHeapHead + 1) % kRecordingHeapCount; 16159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree--; 16169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 16179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Timestamp %lld", 16189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, timestamp); 16199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 16209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ssize_t offset; 16219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size; 16229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<IMemoryHeap> heap = 16239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset, 16249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &size); 16259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 162678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint8_t *data = (uint8_t*)heap->getBase() + offset; 162778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint32_t type = kMetadataBufferTypeGrallocSource; 162878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala memcpy(data, &type, 4); 162978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala memcpy(data + 4, &imgBuffer, sizeof(buffer_handle_t)); 163078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGV("%s: Camera %d: Sending out buffer_handle_t %p", 1631803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala __FUNCTION__, mCameraId, imgBuffer); 16329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala currentClient = mCameraClient; 16339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Call outside mICameraLock to allow re-entrancy from notification 16359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (currentClient != 0) { 16369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala currentClient->dataCallbackTimestamp(timestamp, 16379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala CAMERA_MSG_VIDEO_FRAME, 16389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mBuffers[heapIdx]); 1639d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1640d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 1641d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 16423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag, 16433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala size_t minCount, size_t maxCount) { 16443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala status_t res; 16453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t entry; 16463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala res = find_camera_metadata_entry(mDevice->info(), 16473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tag, 16483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala &entry); 16493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 16503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 16513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 16523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 16533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 16543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 16553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)", 16563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tagSection, tagName, tag, strerror(-res), res); 16573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.count = 0; 16583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.data.u8 = NULL; 16593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } else if (CC_UNLIKELY( 16603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 16613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 16623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 16633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 16643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 16653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 16663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 16673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "Expected between %d and %d values, but got %d values", 16683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 16693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.count = 0; 16703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.data.u8 = NULL; 16713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } 16723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 16733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return entry; 16743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala} 16753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 16763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */ 16773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() { 1680a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1681836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 1682ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 1683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 16843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters params; 1685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 16863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableProcessedSizes = 16873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2); 16883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableProcessedSizes.count) return NO_INIT; 1689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick more intelligently 1691836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth = availableProcessedSizes.data.i32[0]; 1692836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewHeight = availableProcessedSizes.data.i32[1]; 1693836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoWidth = k.mParameters.previewWidth; 1694836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoHeight = k.mParameters.previewHeight; 16953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1696836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setPreviewSize(k.mParameters.previewWidth, k.mParameters.previewHeight); 1697836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setVideoSize(k.mParameters.videoWidth, k.mParameters.videoHeight); 16983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 16993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8::format("%dx%d", 1700836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth, k.mParameters.previewHeight)); 1701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewSizes; 1703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableProcessedSizes.count; i += 2) { 1704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewSizes += ","; 1705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes += String8::format("%dx%d", 1706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableProcessedSizes.data.i32[i], 1707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableProcessedSizes.data.i32[i+1]); 1708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 17093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 1710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes); 17113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 1712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes); 1713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 17153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFpsRanges = 17163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 17173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableFpsRanges.count) return NO_INIT; 1718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1719836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0]; 1720836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1]; 1721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 17223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 17233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8::format("%d,%d", 1724836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0], 1725836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1])); 1726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFpsRange; 1729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewFpsRange += ","; 1731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFpsRange += String8::format("(%d,%d)", 1732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i], 1733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i+1]); 1734f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 17353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 1736f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFpsRange); 1737f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1738f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1739836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 17403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FORMAT, 1741836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala formatEnumToString(k.mParameters.previewFormat)); // NV21 17423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1743836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewTransform = degToTransform(0, 1744c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 1745c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 17463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFormats = 17473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 1748f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1749f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFormats; 1751f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 1752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFormats.count; i++) { 1753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedPreviewFormats += ","; 1754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 1755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableFormats.data.i32[i]) { 1756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1757bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1758bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422SP; 1759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1761bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1762bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 1763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: 1765bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1766bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422I; 1767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: 1769bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1770bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 1771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 1773bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1774bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGB565; 1775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 177611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 177711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala supportedPreviewFormats += 177811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGBA8888; 177911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala break; 178011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 1781f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 178211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 1783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1784f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 178511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala 1786f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 1787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown preview format: %x", 1788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableFormats.data.i32[i]); 1789f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1790f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1791f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 17933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 1794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFormats); 1795f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 1798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // still have to do something sane for them 1799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 18003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 1801836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0]); 1802f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1804f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFrameRates; 1805f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1806f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewFrameRates += ","; 1807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 1808f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i]); 1809f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 18103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 1811f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFrameRates); 1812f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1813f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 18143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableJpegSizes = 18153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 18163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableJpegSizes.count) return NO_INIT; 1817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick maximum 1819836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureWidth = availableJpegSizes.data.i32[0]; 1820836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight = availableJpegSizes.data.i32[1]; 1821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1822836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setPictureSize(k.mParameters.pictureWidth, 1823836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight); 1824f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPictureSizes; 1827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableJpegSizes.count; i += 2) { 1828f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 1829f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 1830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegSizes.data.i32[i], 1831f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegSizes.data.i32[i+1]); 1832f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 18333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 1834f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPictureSizes); 1835f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1836f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 18373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 18383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 18393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 1840f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 18413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableJpegThumbnailSizes = 18423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2); 18433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 1844f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick default thumbnail size sensibly 1846836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0]; 1847836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1]; 1848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 18493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 1850836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0]); 18513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 1852836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1]); 1853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedJpegThumbSizes; 1856f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 1857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 1858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 1859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 1860f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 1861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 18623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 1863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedJpegThumbSizes); 1864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1865f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1866836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality = 90; 18673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 1868836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality); 1869836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality = 90; 18703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 1871836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality); 1872836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegRotation = 0; 18733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 1874836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegRotation); 18753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1876836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsEnabled = false; 1877836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsProcessingMethod = "unknown"; 18783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 18793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1880836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO; 18813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 18823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 18833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 18843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableWhiteBalanceModes = 18853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 1886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1887f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedWhiteBalance; 1888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 1889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 1890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 1891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 1892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 1893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_AUTO: 1894bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1895bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 1896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_INCANDESCENT: 1898bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1899bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 1900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_FLUORESCENT: 1902bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1903bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 1904f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1905f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 1906bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1907bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 1908f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_DAYLIGHT: 1910bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1911bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 1912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1913f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 1914bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1915bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 1916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_TWILIGHT: 1918bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1919bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 1920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_SHADE: 1922bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1923bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 1924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Skipping values not mappable to v1 API 1926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_OFF: 1927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 1930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 1931f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, 1932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 1933f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1934f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1935f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 19373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 1938f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedWhiteBalance); 1939f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1941836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF; 19423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 19433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::EFFECT_NONE); 19443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 19453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableEffects = 19463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 19473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableEffects.count) return NO_INIT; 1948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1949f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedEffects; 1950f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 1951f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 1952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedEffects += ","; 1953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 1954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 1955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_OFF: 1956bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1957bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_NONE; 1958f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_MONO: 1960bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1961bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_MONO; 1962bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala break; 1963f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_NEGATIVE: 1964bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1965bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 1966f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1967f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SOLARIZE: 1968bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1969bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 1970f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1971f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SEPIA: 1972bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1973bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_SEPIA; 1974f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1975f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_POSTERIZE: 1976bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1977bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 1978f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1979f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_WHITEBOARD: 1980bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1981bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 1982f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1983f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_BLACKBOARD: 1984bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1985bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 1986f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1987f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_AQUA: 1988bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 1989bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_AQUA; 1990f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1991f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 1992f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 1993f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableEffects.data.u8[i]); 1994f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1995f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1996f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1997f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 19983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 1999f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2000f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2001836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 20023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 20033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 20043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 20053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAntibandingModes = 20063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 20073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAntibandingModes.count) return NO_INIT; 2008f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2009f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedAntibanding; 2010f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2011f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 2012f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 2013f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2014f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 2015f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_OFF: 2016bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2017bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 2018f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2019f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_50HZ: 2020bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2021bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 2022f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2023f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_60HZ: 2024bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2025bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 2026f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2027f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_AUTO: 2028bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2029bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 2030f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2031f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2032f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 2033f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, 2034f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 2035f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2036f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2037f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2038f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 20393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 2040f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedAntibanding); 2041f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2042f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2043836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.sceneMode = ANDROID_CONTROL_OFF; 20443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 20453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 20463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 20473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableSceneModes = 20483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 20493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableSceneModes.count) return NO_INIT; 2050f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2051bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 2052f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = true; 2053f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool noSceneModes = false; 2054f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 2055f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 2056f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2057f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 2058f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2059f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala noSceneModes = true; 2060f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2061f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 2062f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Not in old API 2063f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2064f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2065f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 2066bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2067bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 2068f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2069f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 2070bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2071bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 2072f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2073f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 2074bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2075bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 2076f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2077f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 2078bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2079bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 2080f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2081f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 2082bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2083bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 2084f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2085f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 2086bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2087bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 2088f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2089f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 2090bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2091bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 2092f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2093f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 2094bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2095bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 2096f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2097f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 2098bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2099bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 2100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2101f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 2102bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2103bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 2104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 2106bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2107bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 2108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 2110bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2111bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 2112f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2113f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 2114bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2115bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 2116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 2118bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2119bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 2120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2121f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 2122bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2123bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 2124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 2127bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala __FUNCTION__, mCameraId, 2128bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala availableSceneModes.data.u8[i]); 2129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2131f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2132f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2133f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (!noSceneModes) { 21343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 2135f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedSceneModes); 2136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2137f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2138f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t flashAvailable = 21403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 21413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!flashAvailable.count) return NO_INIT; 2142f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAeModes = 21443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 21453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAeModes.count) return NO_INIT; 2146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2147f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (flashAvailable.data.u8[0]) { 2148836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = Parameters::FLASH_MODE_AUTO; 21493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 21503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_AUTO); 21513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 21523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 21533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 21543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 21553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 21563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 2157f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 2158f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (availableAeModes.data.u8[i] == 2159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) { 21603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 21613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 2162f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2163f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2164f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 21653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 2166f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedFlashModes); 21673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } else { 2168836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = Parameters::FLASH_MODE_OFF; 21693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 21703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 21713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 21723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 2173f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2174f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t minFocusDistance = 21763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1); 21773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!minFocusDistance.count) return NO_INIT; 21783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 21793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAfModes = 21803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 21813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAfModes.count) return NO_INIT; 21823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2183f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 2184f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Fixed-focus lens 2185836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = Parameters::FOCUS_MODE_FIXED; 21863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 21873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 21883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 21893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 2190f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 2191836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 21923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 21933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 21943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED); 21953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFocusModes = supportedFocusModes + "," + 21963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_INFINITY; 2197f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = true; 2198bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 2199f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 2200f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 2201f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2202f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 2203f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_AUTO: 2204bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2205bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 2206f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2207f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_MACRO: 2208bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2209bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 2210f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2211f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 2212bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2213bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 2214f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2215f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 2216bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2217bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 2218f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2219f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_EDOF: 2220bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2221bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 2222f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2223bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala // Not supported in old API 2224f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_OFF: 2225f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2226f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2227f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2228f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 2229f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableAfModes.data.u8[i]); 2230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2232f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2233f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 22343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 2235f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedFocusModes); 2236f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2237f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t max3aRegions = 22393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 22403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!max3aRegions.count) return NO_INIT; 2241f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 2243f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala max3aRegions.data.i32[0]); 22443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 2245f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "(0,0,0,0,0)"); 2246836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas.clear(); 2247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0)); 22483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 22493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFocalLengths = 22503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS); 22513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 2252f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2253f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float minFocalLength = availableFocalLengths.data.f[0]; 22543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 2255f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t sensorSize = 22573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2); 22583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!sensorSize.count) return NO_INIT; 2259f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2260f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // The fields of view here assume infinity focus, maximum wide angle 2261f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float horizFov = 180 / M_PI * 2262f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength)); 2263f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float vertFov = 180 / M_PI * 2264f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength)); 22653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 22663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 2267f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2268836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation = 0; 22693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 2270836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation); 2271f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t exposureCompensationRange = 22733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2); 22743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 22753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 22763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 2277f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 22783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 2279f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 2280f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t exposureCompensationStep = 22823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1); 22833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 22843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 22853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 2286f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationStep.data.r[0].numerator / 2287f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 2288f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2289836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoExposureLock = false; 22903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 22913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 22923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 22933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2294f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2295836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoWhiteBalanceLock = false; 22963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 22973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 22983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 22993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2300f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2301836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 23023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 2303f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala max3aRegions.data.i32[0]); 23043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 2305f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "(0,0,0,0,0)"); 2306f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.zoom = 0; 2308836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.set(CameraParameters::KEY_ZOOM, k.mParameters.zoom); 23093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 2310f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t maxDigitalZoom = 23123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1); 23133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 2314f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2315f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2316f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 zoomRatios; 2317f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float zoom = 1.f; 2318f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 23196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala (NUM_ZOOM_STEPS-1); 2320f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 23216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 2322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) zoomRatios += ","; 2323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2324f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 2325f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala zoom += zoomIncrement; 2326f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 23273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 2328f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2329f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 23313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 23323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 23333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 2336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "Infinity,Infinity,Infinity"); 2337f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t maxFacesDetected = 23393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1); 23403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 2341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala maxFacesDetected.data.i32[0]); 23423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 2343f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 0); 2344f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 234678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 2347f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 23493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 2350f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 23523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2353f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 23553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 23563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 23573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableVideoStabilizationModes = 23583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 23593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableVideoStabilizationModes.count) return NO_INIT; 2360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 23623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 23633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2364f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 23653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 23663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 2367f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2368f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 236978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala // Always use metadata mode for recording 2370836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.storeMetadataInBuffers = true; 237178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 2372836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.paramsFlattened = params.flatten(); 23733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 2375f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 237661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 2377836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters ¶ms) { 2378be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2379be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2380836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 2381be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 2382be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Check if stream parameters have to change 2383be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint32_t currentWidth, currentHeight; 2384be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->getStreamInfo(mPreviewStreamId, 2385be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ¤tWidth, ¤tHeight, 0); 2386be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2387be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error querying preview stream info: " 2388be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2389be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2390be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2391836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.previewWidth || 2392836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.previewHeight) { 23939e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d", 23949e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId, currentWidth, currentHeight, 2395836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth, params.previewHeight); 2396be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->waitUntilDrained(); 2397be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2398be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error waiting for preview to drain: " 2399be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2400be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2401be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2402be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->deleteStream(mPreviewStreamId); 2403be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2404be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 2405be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "for preview: %s (%d)", __FUNCTION__, mCameraId, 2406be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2407be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2408be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2409be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewStreamId = NO_STREAM; 2410be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2411be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2412be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2413be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewStreamId == NO_STREAM) { 2414be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->createStream(mPreviewWindow, 2415836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth, params.previewHeight, 2416be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, 2417be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mPreviewStreamId); 2418be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2419be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)", 2420be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 2421be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2422be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2423be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2424be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2425c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = mDevice->setStreamTransform(mPreviewStreamId, 2426836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewTransform); 2427c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (res != OK) { 2428c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview stream transform: " 2429c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2430c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return res; 2431c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 2432c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 2433be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 2434be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2435be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2436836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters ¶ms) { 2437a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 24386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 24396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mPreviewRequest == NULL) { 24406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 24416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &mPreviewRequest); 24426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 24436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default preview request: " 24446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 24456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 24466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 24476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2448be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2449836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRequestCommon(mPreviewRequest, params); 2450be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2451be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of preview " 2452be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 2453be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2454be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2455be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2456be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 24576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 24586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 24596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 2460836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureStream(const Parameters ¶ms) { 2461be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2462d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 2463d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Find out buffer size for JPEG 2464d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_entry_t maxJpegSize = 2465d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala staticInfo(ANDROID_JPEG_MAX_SIZE); 2466d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (maxJpegSize.count == 0) { 2467d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!", 2468d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 2469d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 2470d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2471d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2472d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureConsumer == 0) { 2473d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Create CPU buffer queue endpoint 2474d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer = new CpuConsumer(1); 2475d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this)); 2476d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer")); 2477d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureWindow = new SurfaceTextureClient( 2478d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->getProducerInterface()); 2479d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Create memory for API consumption 24809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1, 24819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "Camera2Client::CaptureHeap"); 24829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mCaptureHeap->mHeap->getSize() == 0) { 2483d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for capture", 2484d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 2485d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return NO_MEMORY; 2486d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2487d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2488d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2489be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mCaptureStreamId != NO_STREAM) { 2490d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Check if stream parameters have to change 2491d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t currentWidth, currentHeight; 2492d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->getStreamInfo(mCaptureStreamId, 2493d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ¤tWidth, ¤tHeight, 0); 2494d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2495d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying capture output stream info: " 2496d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2497d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2498d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2499836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.pictureWidth || 2500836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.pictureHeight) { 2501d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->deleteStream(mCaptureStreamId); 2502d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2503d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 2504d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "for capture: %s (%d)", __FUNCTION__, mCameraId, 2505d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala strerror(-res), res); 2506d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2507d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2508d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId = NO_STREAM; 2509d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2510d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2511be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2512be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mCaptureStreamId == NO_STREAM) { 2513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Create stream for HAL production 2514be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->createStream(mCaptureWindow, 2515836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.pictureWidth, params.pictureHeight, 2516be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0], 2517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mCaptureStreamId); 2518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for capture: " 2520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2521be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2523be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2524be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2525d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 2526d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 2527be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2528836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest(const Parameters ¶ms) { 2529d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 2530d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 2531d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureRequest == NULL) { 2532d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE, 2533d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala &mCaptureRequest); 2534d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2535d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 2536d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2537d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2538d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2539d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2541836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRequestCommon(mCaptureRequest, params); 2542be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2543be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 2544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 2545be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2546be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2547be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2548be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2549be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2550be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_THUMBNAIL_SIZE, 2551836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.jpegThumbSize, 2); 2552be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2553be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2554be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_THUMBNAIL_QUALITY, 2555836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegThumbQuality, 1); 2556be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2557be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2558be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_QUALITY, 2559836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegQuality, 1); 2560be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2561be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2562be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_ORIENTATION, 2563836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegRotation, 1); 2564be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2565be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2566836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.gpsEnabled) { 2567be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2568be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 2569836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.gpsCoordinates, 3); 2570be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2571be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2572be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 2573836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.gpsTimestamp, 1); 2574be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2575be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2576be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 2577836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.gpsProcessingMethod.string(), 2578836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.gpsProcessingMethod.size()); 2579be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2580be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else { 2581be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2582be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES); 2583be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2584be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2585be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP); 2586be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2587be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2588be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD); 2589be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2590be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2591be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2592d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 2593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 2594d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2595836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters ¶ms) { 25969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ATRACE_CALL(); 25979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 25989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingRequest == NULL) { 25999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD, 26009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &mRecordingRequest); 26019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 26029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default recording request:" 26039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 26049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 26059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2608836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRequestCommon(mRecordingRequest, params); 26099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 26109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of recording " 26119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 26129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 26139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 26149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 26169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 26179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 26189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2619836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters ¶ms) { 26209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 26219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 26229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingConsumer == 0) { 26239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Create CPU buffer queue endpoint 2624803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala mRecordingConsumer = new MediaConsumer(kRecordingHeapCount); 26259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this)); 26269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer")); 26279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingWindow = new SurfaceTextureClient( 26289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->getProducerInterface()); 26299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Allocate memory later, since we don't know buffer size until receipt 26309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 26329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 26339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Check if stream parameters have to change 26349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint32_t currentWidth, currentHeight; 26359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->getStreamInfo(mRecordingStreamId, 26369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ¤tWidth, ¤tHeight, 0); 26379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 26389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error querying recording output stream info: " 26399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 26409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 26419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 2642836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.videoWidth || 2643836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.videoHeight) { 26449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Should wait to be sure previous recording has finished 26459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->deleteStream(mRecordingStreamId); 26469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 26479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 26489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "for recording: %s (%d)", __FUNCTION__, mCameraId, 26499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 26509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 26519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingStreamId = NO_STREAM; 26539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 26569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingStreamId == NO_STREAM) { 26579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->createStream(mRecordingWindow, 2658836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.videoWidth, params.videoHeight, 265978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId); 26609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 26619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for recording: " 26629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 26639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 26649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 26679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 26689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 26699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2670836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(camera_metadata_t *request, 2671836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const Parameters ¶ms) { 2672be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2673be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2674be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2675836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ANDROID_CONTROL_AE_TARGET_FPS_RANGE, params.previewFpsRange, 2); 2676be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2677be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2678836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint8_t wbMode = params.autoWhiteBalanceLock ? 2679836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ANDROID_CONTROL_AWB_LOCKED : params.wbMode; 2680be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2681be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AWB_MODE, &wbMode, 1); 2682be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2683be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2684836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ANDROID_CONTROL_EFFECT_MODE, ¶ms.effectMode, 1); 2685be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2686be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2687be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_MODE, 2688836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.antibandingMode, 1); 2689be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2690be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2691be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t controlMode = 2692836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ? 2693be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE; 2694be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2695be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_MODE, &controlMode, 1); 2696be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2697be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) { 2698be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2699be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_SCENE_MODE, 2700836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.sceneMode, 1); 2701be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2702be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2703be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2704be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t flashMode = ANDROID_FLASH_OFF; 2705be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t aeMode; 2706836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (params.flashMode) { 2707be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_OFF: 2708be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON; break; 2709be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 2710be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break; 2711be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_ON: 2712be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break; 2713be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 2714be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON; 2715be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala flashMode = ANDROID_FLASH_TORCH; 2716be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 2717be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 2718be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break; 2719be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala default: 2720be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 2721836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala mCameraId, params.flashMode); 2722be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return BAD_VALUE; 2723be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2724836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED; 2725be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2726be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2727be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_FLASH_MODE, &flashMode, 1); 2728be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2729be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2730be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_MODE, &aeMode, 1); 2731be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2732be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2733be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float focusDistance = 0; // infinity focus in diopters 2734be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t focusMode; 2735836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (params.focusMode) { 2736be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 2737be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 2738be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 2739be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 2740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 2741836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusMode = params.focusMode; 2742be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 2743be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 2744be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 2745be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusMode = ANDROID_CONTROL_AF_OFF; 2746be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 2747be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala default: 2748be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 2749836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala mCameraId, params.focusMode); 2750be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return BAD_VALUE; 2751be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2752be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2753be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); 2754be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2755be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2756be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AF_MODE, &focusMode, 1); 2757be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2758be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2759836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala size_t focusingAreasSize = params.focusingAreas.size() * 5; 2760be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t *focusingAreas = new int32_t[focusingAreasSize]; 2761be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala for (size_t i = 0; i < focusingAreasSize; i += 5) { 2762836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 0] = params.focusingAreas[i].left; 2763836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 1] = params.focusingAreas[i].top; 2764836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 2] = params.focusingAreas[i].right; 2765836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 3] = params.focusingAreas[i].bottom; 2766836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 4] = params.focusingAreas[i].weight; 2767be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2768be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2769be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AF_REGIONS, focusingAreas,focusingAreasSize); 2770be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2771be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala delete[] focusingAreas; 2772be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2773be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2774be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_EXP_COMPENSATION, 2775836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.exposureCompensation, 1); 2776be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2777be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2778836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala size_t meteringAreasSize = params.meteringAreas.size() * 5; 2779be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t *meteringAreas = new int32_t[meteringAreasSize]; 2780be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala for (size_t i = 0; i < meteringAreasSize; i += 5) { 2781836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 0] = params.meteringAreas[i].left; 2782836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 1] = params.meteringAreas[i].top; 2783836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 2] = params.meteringAreas[i].right; 2784836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 3] = params.meteringAreas[i].bottom; 2785836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 4] = params.meteringAreas[i].weight; 2786be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2787be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2788be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_REGIONS, meteringAreas, meteringAreasSize); 2789be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2790be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2791be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2792be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AWB_REGIONS, meteringAreas, meteringAreasSize); 2793be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2794be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala delete[] meteringAreas; 2795be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2796be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Need to convert zoom index into a crop rectangle. The rectangle is 2797be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // chosen to maximize its area on the sensor 2798be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2799be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t maxDigitalZoom = 2800be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM); 2801be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 2802be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala (NUM_ZOOM_STEPS-1); 2803836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala float zoomRatio = 1 + zoomIncrement * params.zoom; 2804be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2805be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t activePixelArraySize = 2806be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2); 2807be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t arrayWidth = activePixelArraySize.data.i32[0]; 2808be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t arrayHeight = activePixelArraySize.data.i32[1]; 2809be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomLeft, zoomTop, zoomWidth, zoomHeight; 2810836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.previewWidth >= params.previewHeight) { 2811be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomWidth = arrayWidth / zoomRatio; 2812be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomHeight = zoomWidth * 2813836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewHeight / params.previewWidth; 2814be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else { 2815be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomHeight = arrayHeight / zoomRatio; 2816be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomWidth = zoomHeight * 2817836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth / params.previewHeight; 2818be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2819be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomLeft = (arrayWidth - zoomWidth) / 2; 2820be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomTop = (arrayHeight - zoomHeight) / 2; 2821be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2822be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth }; 2823be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2824be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_SCALER_CROP_REGION, cropRegion, 3); 2825be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2826be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2827be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // TODO: Decide how to map recordingHint, or whether just to ignore it 2828be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2829836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint8_t vstabMode = params.videoStabilization ? 2830be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_ON : 2831be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; 2832be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2833be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 2834be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &vstabMode, 1); 2835be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2836be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2837be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 2838be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2839be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2840be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateEntry(camera_metadata_t *buffer, 2841be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint32_t tag, const void *data, size_t data_count) { 2842be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t entry; 2843be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2844be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = find_camera_metadata_entry(buffer, tag, &entry); 2845be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res == NAME_NOT_FOUND) { 2846be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = add_camera_metadata_entry(buffer, 2847be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala tag, data, data_count); 2848be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else if (res == OK) { 2849be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = update_camera_metadata_entry(buffer, 2850be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala entry.index, data, data_count, NULL); 2851be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2852be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2853be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2854be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", 2855be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, get_camera_metadata_section_name(tag), 2856be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2857be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2858be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2859be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2860be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2861be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::deleteEntry(camera_metadata_t *buffer, uint32_t tag) { 2862be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t entry; 2863be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2864be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = find_camera_metadata_entry(buffer, tag, &entry); 2865be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res == NAME_NOT_FOUND) { 2866be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 2867be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else if (res != OK) { 2868be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error looking for entry %s.%s (%x): %s %d", 2869be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, 2870be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_section_name(tag), 2871be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2872be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2873be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2874be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = delete_camera_metadata_entry(buffer, entry.index); 2875be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2876be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", 2877be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, 2878be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_section_name(tag), 2879be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2880be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2881be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2882be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2883836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 28846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) { 28856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 28866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 28876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 28886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 28896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 28906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 28916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 28926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 28936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YV12 : // YV12 28946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 28956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RGB_565 : // RGB565 28966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 28976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 28986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 28996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 29006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 29016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 29026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 29033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) { 29043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char *fmt; 29053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala switch(format) { 29063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 29073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 29083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 29103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 29113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 29133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 29143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 29163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 29173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 29193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 29203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 29223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 29233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 29253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 29263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 29273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala default: 29293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 29303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala __FUNCTION__, format); 29313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = NULL; 29323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } 29343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return fmt; 29353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala} 29366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 29376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) { 29386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 29396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 29406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_AUTO : 29416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 29426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_INCANDESCENT : 29436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 29446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_FLUORESCENT : 29456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 29466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_WARM_FLUORESCENT : 29476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 29486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_DAYLIGHT : 29496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 29506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT : 29516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 29526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_TWILIGHT : 29536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 29546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_SHADE : 29556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 29566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 29576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 29586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) { 29596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 29606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 29616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_OFF : 29626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 29636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_MONO : 29646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 29656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_NEGATIVE : 29666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 29676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SOLARIZE : 29686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 29696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SEPIA : 29706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 29716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_POSTERIZE : 29726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 29736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_WHITEBOARD : 29746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 29756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_BLACKBOARD : 29766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 29776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_AQUA : 29786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 29796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 29806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 29816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) { 29826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 29836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 29846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_AUTO : 29856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 29866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_OFF : 29876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 29886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_50HZ : 29896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 29906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_60HZ : 29916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 29926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 29936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 29946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) { 29956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 29966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 29976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 29986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 29996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 30006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 30016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 30026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 30036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 30046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 30056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 30066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 30076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 30086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 30096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 30106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 30116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 30126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 30136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 30146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 30156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 30166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 30176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 30186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 30196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 30206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 30216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 30226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 30236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 30246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 30256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 30266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 30276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 30286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 30296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum( 30326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *flashMode) { 30336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 30346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 30356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 30366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 30376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 30386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 30396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_ON : 30406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 30416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 30426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 30436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 30446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 30456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum( 30486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *focusMode) { 30496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 30506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 30516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 30526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 30536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 30546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 30556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 30566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 30576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 30586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 30596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 30606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 30616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 30626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 30636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 30646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 30656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr, 30686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> *areas) { 30696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 30706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->clear(); 30716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areasCStr == NULL) { 30726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 30736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->push(); 30746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 30756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 30766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala String8 areasStr(areasCStr); 30776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 30786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala while (areaStart != 0) { 30796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 30806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala char *numEnd; 30816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int vals[NUM_FIELDS]; 30826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 30836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 30846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 30856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 30866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala area = numEnd + 1; 30876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 30886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->push(Parameters::Area( 30896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 30906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 30916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 30926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 30936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas, 30966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t maxRegions) { 30976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Definition of valid area can be found in 30986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // include/camera/CameraParameters.h 30996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 31006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() == 1) { 31016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas[0].left == 0 && 31026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].top == 0 && 31036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].right == 0 && 31046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].bottom == 0 && 31056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].weight == 0) { 31066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 31076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 31086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() > maxRegions) { 31116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Too many areas requested: %d", 31126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, areas.size()); 31136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 31146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 31166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 31176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala a != areas.end(); a++) { 31186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 31196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 31206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 31216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 31226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 31236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 31246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 31256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 31276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 31286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 31296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) { 31306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return !boolStr ? false : 31316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 31326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala false; 31336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 31346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 3135c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalaint Camera2Client::degToTransform(int degrees, bool mirror) { 3136c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (!mirror) { 3137c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (degrees == 0) return 0; 3138c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 3139c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 3140c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 3141c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 3142c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 3143c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 3144c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 3145c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 3146c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 3147c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 3148c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 3149c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 3150c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 3151c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 3152c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 3153c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return -1; 3154c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 31556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 315661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android 3157