Camera2Client.cpp revision 603b12efa16e7afb4e6c75f6b353216c83e8e135
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), 553a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mState(DISCONNECTED), 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), 61983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingRequest(NULL), 62983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingHeapCount(kDefaultRecordingHeapCount) 63f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 64a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice = new Camera2Device(cameraId); 67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const { 703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala int callingPid = getCallingPid(); 713a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if (callingPid == mClientPid) return NO_ERROR; 723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala ALOGE("%s: attempt to use a locked camera from a different process" 743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid); 753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala return PERMISSION_DENIED; 763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala} 773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module) 79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 80a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 819e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = mDevice->initialize(module); 85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 91174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala res = mDevice->setNotifyCallback(this); 92174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = buildDefaultParameters(); 94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (gLogLevel >= 1) { 101836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCameraId); 104836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ALOGD("%s", k.mParameters.paramsFlattened.string()); 105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = STOPPED; 1086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 11061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 11161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 11261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() { 113a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId); 1154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDestructionStarted = true; 117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala // Rewrite mClientPid to allow shutdown by CameraService 1193a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mClientPid = getCallingPid(); 120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala disconnect(); 12161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 12261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 12361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) { 124611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala String8 result; 1253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", 126611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mCameraId, 127611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala getCameraClient()->asBinder().get(), 128611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mClientPid); 1297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" State: "); 1307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 1317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 132836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const Parameters& p = mParameters.unsafeUnlock(); 133836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append(getStateName(mState)); 1357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1364ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append("\n Current parameters:\n"); 1377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview size: %d x %d\n", 138836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewWidth, p.previewHeight); 1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview FPS range: %d - %d\n", 140836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFpsRange[0], p.previewFpsRange[1]); 1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview HAL pixel format: 0x%x\n", 142836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFormat); 14311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala result.appendFormat(" Preview transform: %x\n", 144836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewTransform); 1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Picture size: %d x %d\n", 146836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.pictureWidth, p.pictureHeight); 1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 148836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegThumbSize[0], p.jpegThumbSize[1]); 1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 150836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegQuality, p.jpegThumbQuality); 151836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation); 1527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS tags %s\n", 153836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsEnabled ? "enabled" : "disabled"); 154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (p.gpsEnabled) { 1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 156836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[0], p.gpsCoordinates[1], 157836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[2]); 1587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS timestamp: %lld\n", 159836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsTimestamp); 1607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS processing method: %s\n", 161836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsProcessingMethod.string()); 1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" White balance mode: "); 165836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.wbMode) { 1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO) 1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT) 1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT) 1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT) 1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT) 1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT) 1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT) 1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE) 1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Effect mode: "); 178836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.effectMode) { 1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF) 1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO) 1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE) 1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE) 1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA) 1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE) 1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD) 1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD) 1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA) 1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Antibanding mode: "); 192836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.antibandingMode) { 1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO) 1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF) 1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ) 1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ) 1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Scene mode: "); 201836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.sceneMode) { 2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append("AUTO\n"); break; 2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Flash mode: "); 223836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.flashMode) { 2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focus mode: "); 234836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.focusMode) { 2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focusing areas:\n"); 247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.focusingAreas.size(); i++) { 2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 249836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].left, 250836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].top, 251836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].right, 252836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].bottom, 253836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].weight); 2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Exposure compensation index: %d\n", 257836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.exposureCompensation); 2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" AE lock %s, AWB lock %s\n", 260836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoExposureLock ? "enabled" : "disabled", 261836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoWhiteBalanceLock ? "enabled" : "disabled" ); 2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Metering areas:\n"); 264836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.meteringAreas.size(); i++) { 2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 266836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].left, 267836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].top, 268836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].right, 269836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].bottom, 270836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].weight); 2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 273836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Zoom index: %d\n", p.zoom); 274836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Video size: %d x %d\n", p.videoWidth, 275836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoHeight); 2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Recording hint is %s\n", 278836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.recordingHint ? "set" : "not set"); 2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Video stabilization is %s\n", 281836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoStabilization ? "enabled" : "disabled"); 2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current streams:\n"); 2843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Preview stream ID: %d\n", mPreviewStreamId); 2853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Capture stream ID: %d\n", mCaptureStreamId); 286836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Recording stream ID: %d\n", mRecordingStreamId); 2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current requests:\n"); 2893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mPreviewRequest != NULL) { 2903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Preview request:\n"); 2913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 292428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(mPreviewRequest, fd, 2, 6); 2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Preview request: undefined\n"); 2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mCaptureRequest != NULL) { 2993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Capture request:\n"; 3003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 301428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(mCaptureRequest, fd, 2, 6); 3023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 3033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Capture request: undefined\n"; 3043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 3053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 3063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 307428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala if (mRecordingRequest != NULL) { 308428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala result = " Recording request:\n"; 309428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala write(fd, result.string(), result.size()); 310428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(mRecordingRequest, fd, 2, 6); 311428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala } else { 312428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala result = " Recording request: undefined\n"; 313428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala write(fd, result.string(), result.size()); 314428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala } 315428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala 3163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Device dump:\n"; 317611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala write(fd, result.string(), result.size()); 3187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t res = mDevice->dump(fd, args); 3203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (res != OK) { 3213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Error dumping device: %s (%d)", 3223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala strerror(-res), res); 3233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 3243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 3257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM 327611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala return NO_ERROR; 32861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 32961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3304ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) { 3314ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 3324ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala switch(state) { 3333a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala CASE_ENUM_TO_CHAR(DISCONNECTED) 3344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 3354ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 3364ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 3374ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 3384ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 3394ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 3404ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala default: 3414ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return "Unknown state!"; 3424ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala break; 3434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 3444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR 3454ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala} 3464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 34761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface 34861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 34961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() { 350a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3519e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 352ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 3533a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 3543a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 355ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 356f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mDevice == 0) return; 357f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 35836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala stopPreviewL(); 3596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 360d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->waitUntilDrained(); 361d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 362d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 3636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mDevice->deleteStream(mPreviewStreamId); 364d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mPreviewStreamId = NO_STREAM; 365d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 366d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 367d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureStreamId != NO_STREAM) { 368d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->deleteStream(mCaptureStreamId); 369d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId = NO_STREAM; 3706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 371f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 372898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 373898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala mDevice->deleteStream(mRecordingStreamId); 374898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala mRecordingStreamId = NO_STREAM; 375898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala } 376898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 3773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mDevice.clear(); 3783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mState = DISCONNECTED; 3793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 38061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala CameraService::Client::disconnect(); 38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 38261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 38361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) { 384a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3859e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 386ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 387ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 3889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != 0 && getCallingPid() != mClientPid) { 3899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Connection attempt from pid %d; " 3909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "current locked to pid %d", __FUNCTION__, 3919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraId, getCallingPid(), mClientPid); 3929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return BAD_VALUE; 3939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 3949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 3969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient = client; 3979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 39961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 40061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 40161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() { 402a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4039e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 404ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 4069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 407ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == 0) { 4099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != getCallingPid()) { 4149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 4179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 42061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 42161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 42261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() { 423a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4249e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 425ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 4279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 428ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Check for uninterruptable conditions 4309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == getCallingPid()) { 4329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = 0; 4339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient.clear(); 4349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 4389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 44061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 44161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay( 4436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<Surface>& surface) { 444a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4459e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 446ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4473a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 4483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 449ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surface != 0) { 4536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surface->asBinder(); 4546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = surface; 4556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 45736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder,window); 45861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 45961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture( 4616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<ISurfaceTexture>& surfaceTexture) { 462a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4639e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 464ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 4663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 467ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surfaceTexture != 0) { 4716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surfaceTexture->asBinder(); 4726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = new SurfaceTextureClient(surfaceTexture); 4736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 47436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder, window); 4756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 4766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 47736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder, 478be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala sp<ANativeWindow> window) { 479a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (binder == mPreviewSurface) { 4839e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: New window is same as old window", 4849e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId); 4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return NO_ERROR; 4866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 4893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala case DISCONNECTED: 4909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 4919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STILL_CAPTURE: 4929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 4939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 4949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 4959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 4969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 4979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 4989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK 4999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 5019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Already running preview - need to stop and create a new stream 5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Optimize this so that we don't wait for old stream to drain 5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // before spinning up new stream 5049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mDevice->setStreamingRequest(NULL); 5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = WAITING_FOR_PREVIEW_WINDOW; 5069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 5089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 509d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 510be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->waitUntilDrained(); 511be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 512be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error waiting for preview to drain: %s (%d)", 513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 514be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 5166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->deleteStream(mPreviewStreamId); 5176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Unable to delete old preview stream: %s (%d)", 519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 5206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewStreamId = NO_STREAM; 5236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 525bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala mPreviewSurface = binder; 526be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewWindow = window; 527bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 5286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState == WAITING_FOR_PREVIEW_WINDOW) { 52936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return startPreviewL(); 5306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 53361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 53461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 53561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) { 536a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 537ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 5383a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 5393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 54061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 54161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 54261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() { 543a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5449e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 545ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 5463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 5473a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 54836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return startPreviewL(); 549d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 550ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 55136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::startPreviewL() { 552d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 5544ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (mState >= PREVIEW) { 5554ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGE("%s: Can't start preview in state %s", 5564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala __FUNCTION__, getStateName(mState)); 5574ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return INVALID_OPERATION; 5584ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 5596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 560be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewWindow == 0) { 5616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = WAITING_FOR_PREVIEW_WINDOW; 5626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 5636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 564be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mState = STOPPED; 5656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 566836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 5679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 568836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updatePreviewStream(k.mParameters); 569be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 570be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 571be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 572be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 5736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 575be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewRequest == NULL) { 576836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updatePreviewRequest(k.mParameters); 577be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 578be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)", 579be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 580be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 581be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 5826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 584be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mPreviewRequest, 585be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 586be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mPreviewStreamId, 1); 5876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 5886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)", 5896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 590be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 591be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 592be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = sort_camera_metadata(mPreviewRequest); 593be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 594be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)", 595be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 5966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 5976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 6006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 601bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview request to start preview: " 602bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala "%s (%d)", 6036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 6056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = PREVIEW; 6076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 60961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 61061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 61161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() { 612a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6139e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 614ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6163a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 61736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala stopPreviewL(); 618ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala} 619ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 62036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() { 621ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala ATRACE_CALL(); 622d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 6233a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala case DISCONNECTED: 624d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Call before initialized", 625d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 626d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 627d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STOPPED: 628d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 629d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 630d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot stop preview during still capture.", 631d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 632d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 633d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 634d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Handle record stop here 635d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 636d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->setStreamingRequest(NULL); 6372267106c98f461b730c772a913da946c391a178cEino-Ville Talvala mDevice->waitUntilDrained(); 638d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 639d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STOPPED; 640d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 641d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 642d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 643d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState); 644d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 64561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 64661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 64761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() { 648a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 649ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6513a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return false; 6523a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 6536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return mState == PREVIEW; 65461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 65561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 65661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 657a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 658ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6603a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 6613a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 66278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala switch (mState) { 66378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala case RECORD: 66478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala case VIDEO_SNAPSHOT: 66578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Can't be called in state %s", 66678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 66778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 66878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala default: 66978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala // OK 67078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala break; 67178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 672836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 67378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 674836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.storeMetadataInBuffers = enabled; 67578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 67678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return OK; 67761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 67861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 67961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() { 680a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6819e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 682ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 6843a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 6853a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 6869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 6879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 68836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala res = startPreviewL(); 6899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) return res; 6909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 6929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Ready to go 6939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 6959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 6969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to call this when recording is already on 6979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 6989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 7009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't start recording in state %s", 7019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 7029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 7039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 7049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 705836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 7069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 707836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (!k.mParameters.storeMetadataInBuffers) { 70878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording only supported in metadata mode, but " 70978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "non-metadata recording mode requested!", __FUNCTION__, 71078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mCameraId); 71178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 71278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 71378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 714836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRecordingStream(k.mParameters); 7159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 7179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingRequest == NULL) { 722836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRecordingRequest(k.mParameters); 7239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)", 7259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId }; 7319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mRecordingRequest, 7329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 7339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala outputStreams, 2); 7349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)", 7369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = sort_camera_metadata(mRecordingRequest); 7409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)", 7429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mRecordingRequest); 7479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set recording request to start " 7499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "recording: %s (%d)", __FUNCTION__, mCameraId, 7509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 7519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = RECORD; 7549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 75661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 75761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 75861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() { 759a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 7609e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 761ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 7633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 7643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 7659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 7669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 7679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to stop 7689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 7699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 7709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 7719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STILL_CAPTURE: 7729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 7739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 7749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop recording in state %s", 7759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 7769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 7779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 7789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Back to preview. Since record can only be reached through preview, 7809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // all preview stream setup should be up to date. 7819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 7829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to switch back to preview request: " 7849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 7859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 7869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Should recording heap be freed? Can't do it yet since requests 7899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // could still be in flight. 7909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = PREVIEW; 79261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 79361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 79461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() { 795a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 796ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7978da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 7983a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return false; 7993a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 8008da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong return recordingEnabledL(); 8018da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong} 8028da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 8038da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() { 8048da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong ATRACE_CALL(); 8058da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 8069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return (mState == RECORD || mState == VIDEO_SNAPSHOT); 80761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 80861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 80961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 810a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 811ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 8123a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 8133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 8149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Make sure this is for the current heap 8159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ssize_t offset; 8169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size; 8179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 8189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) { 8199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release " 8209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "(got %x, expected %x)", __FUNCTION__, mCameraId, 8219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala heap->getHeapID(), mRecordingHeap->mHeap->getHeapID()); 8229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 8239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 82478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint8_t *data = (uint8_t*)heap->getBase() + offset; 82578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint32_t type = *(uint32_t*)data; 82678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (type != kMetadataBufferTypeGrallocSource) { 82778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)", 82878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource); 82978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return; 83078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 83178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala buffer_handle_t imgBuffer = *(buffer_handle_t*)(data + 4); 83278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId, 833803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala imgBuffer); 83478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala res = mRecordingConsumer->freeBuffer(imgBuffer); 83578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (res != OK) { 83678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):" 83778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "%s (%d)", 83878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala __FUNCTION__, mCameraId, imgBuffer, strerror(-res), res); 83978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return; 84078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 84178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 8429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree++; 84361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 84461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 84561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() { 846a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 847ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 8483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 8493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 8503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 851174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 852174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 853174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala LockedParameters::Key k(mParameters); 854174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.currentAfTriggerId = ++k.mParameters.afTriggerCounter; 855174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala triggerId = k.mParameters.currentAfTriggerId; 856174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 857174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 858174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerAutofocus(triggerId); 859174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 8606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 86161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 86261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 86361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() { 864a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 865ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 8663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 8673a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 8683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 869174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 870174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 871174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala LockedParameters::Key k(mParameters); 872174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala triggerId = ++k.mParameters.afTriggerCounter; 873174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 874174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 875174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerCancelAutofocus(triggerId); 876174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 8776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 87861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 87961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 88061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) { 881a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 882ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 883d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 8843a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 885d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 886d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 8873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala case DISCONNECTED: 888d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STOPPED: 889d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 890d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 891d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 892d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 893d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 894d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 895d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Good to go for takePicture 896d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 897d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 898d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case VIDEO_SNAPSHOT: 899d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Already taking a picture", 900d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 901d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 902d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 903d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 904836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 905d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 906836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateCaptureStream(k.mParameters); 9074ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 908be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 909be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 9104ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 9114ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 912d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 913d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureRequest == NULL) { 914836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateCaptureRequest(k.mParameters); 9154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 916be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't create still image capture request: " 917be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 9184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 9194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 920d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 921d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 922d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_entry_t outputStreams; 9239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState == PREVIEW) { 9249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId }; 9259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS, 9269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &streamIds, 2); 9279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } else if (mState == RECORD) { 9289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId, 9299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureStreamId }; 9309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS, 9319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &streamIds, 3); 9329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 9339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 934d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 935d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still image capture request: " 936d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 937d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 938d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 939d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 940be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = sort_camera_metadata(mCaptureRequest); 941be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 942be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)", 943be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 944be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 945be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 946d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 947d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest); 948d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (captureCopy == NULL) { 949d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 950d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 951d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return NO_MEMORY; 952d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 953d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 954d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mState == PREVIEW) { 955d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->setStreamingRequest(NULL); 956d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 957d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 958d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 959d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 960d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 961d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 962d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 9639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 964d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->capture(captureCopy); 965d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 966d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 967d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 968d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 969d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 970d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 971d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 972d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 973d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 974d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STILL_CAPTURE; 975d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 976d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 977d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = VIDEO_SNAPSHOT; 978d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 979d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 980d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state for still capture!", 981d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 982d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 983d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 984d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 985d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 98661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 98761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 98861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) { 989a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 9909e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 991ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 9926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala status_t res; 9933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 9943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 9953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala LockedParameters::Key k(mParameters); 9966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala CameraParameters newParams(params); 9986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only 10006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // parameters such as supported preview sizes, etc. Should probably 10016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // produce an error if they're changed. 10026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala /** Extract and verify new parameters */ 10046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t i; 10066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_SIZE 10086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int previewWidth, previewHeight; 10096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getPreviewSize(&previewWidth, &previewHeight); 10106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 1011836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewWidth != k.mParameters.previewWidth || 1012836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala previewHeight != k.mParameters.previewHeight) { 10136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState >= PREVIEW) { 10146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 10159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 10169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, 1017836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth, k.mParameters.previewHeight, 10189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala previewWidth, previewHeight); 10196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePreviewSizes = 10226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 10236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePreviewSizes.count; i += 2 ) { 10246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availablePreviewSizes.data.i32[i] == previewWidth && 10256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availablePreviewSizes.data.i32[i+1] == previewHeight) break; 10266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePreviewSizes.count) { 10286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 10296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, previewWidth, previewHeight); 10306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FPS_RANGE 103511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int previewFpsRange[2]; 103611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int previewFps = 0; 10376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool fpsRangeChanged = false; 103811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]); 1039836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFpsRange[0] != k.mParameters.previewFpsRange[0] || 1040836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala previewFpsRange[1] != k.mParameters.previewFpsRange[1]) { 10416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala fpsRangeChanged = true; 10426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePreviewFpsRanges = 10436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 10446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 10456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 104611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[0]) && 10476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 104811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1]) ) { 10496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala break; 10506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 10536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 105411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala __FUNCTION__, previewFpsRange[0], previewFpsRange[1]); 10556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 105711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFps = previewFpsRange[0]; 10586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FORMAT 10616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int previewFormat = formatStringToEnum(newParams.getPreviewFormat()); 1062836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFormat != k.mParameters.previewFormat) { 10636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState >= PREVIEW) { 10646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 10656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "is active!", __FUNCTION__); 10666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFormats = 10696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 10706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFormats.count; i++) { 10716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableFormats.data.i32[i] == previewFormat) break; 10726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFormats.count) { 10746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 10756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), previewFormat); 10766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FRAME_RATE 10816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Deprecated, only use if the preview fps range is unchanged this time. 10826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // The single-value FPS is the same as the minimum of the range. 10836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (!fpsRangeChanged) { 10846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala previewFps = newParams.getPreviewFrameRate(); 1085836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFps != k.mParameters.previewFps) { 10866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFrameRates = 10876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 10886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 10896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableFrameRates.data.i32[i] == previewFps) break; 10906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFrameRates.count) { 10926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 10936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, previewFps); 10946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 109611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[0] = availableFrameRates.data.i32[i]; 109711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1] = availableFrameRates.data.i32[i+1]; 10986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PICTURE_SIZE 11026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int pictureWidth, pictureHeight; 11036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getPictureSize(&pictureWidth, &pictureHeight); 1104836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (pictureWidth == k.mParameters.pictureWidth || 1105836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala pictureHeight == k.mParameters.pictureHeight) { 11066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePictureSizes = 11076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 11086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePictureSizes.count; i+=2) { 11096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availablePictureSizes.data.i32[i] == pictureWidth && 11106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availablePictureSizes.data.i32[i+1] == pictureHeight) break; 11116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePictureSizes.count) { 11136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 11146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, pictureWidth, pictureHeight); 11156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 112011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int jpegThumbSize[2]; 112111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[0] = 11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 112311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[1] = 11246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 1125836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (jpegThumbSize[0] != k.mParameters.jpegThumbSize[0] || 1126836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala jpegThumbSize[1] != k.mParameters.jpegThumbSize[1]) { 11276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableJpegThumbSizes = 11286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 11296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 113011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] && 113111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) { 11326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala break; 11336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 11366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 113711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]); 11386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 11436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegThumbQuality = 11446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 11456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegThumbQuality < 0 || jpegThumbQuality > 100) { 11466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 11476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegThumbQuality); 11486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_QUALITY 11526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegQuality = 11536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 11546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegQuality < 0 || jpegQuality > 100) { 11556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 11566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegQuality); 11576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ROTATION 11616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegRotation = 11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 11636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegRotation != 0 && 11646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 90 && 11656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 180 && 11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 270) { 11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegRotation); 11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // GPS 11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool gpsEnabled = false; 117411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala double gpsCoordinates[3] = {0,0,0}; 11756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int64_t gpsTimestamp = 0; 11766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala String8 gpsProcessingMethod; 11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsLatStr = 11786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 11796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (gpsLatStr != NULL) { 11806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsLongStr = 11816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 11826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsAltitudeStr = 11836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 11846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsTimeStr = 11856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 11866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsProcMethodStr = 11876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 11886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (gpsLongStr == NULL || 11896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsAltitudeStr == NULL || 11906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsTimeStr == NULL || 11916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsProcMethodStr == NULL) { 11926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 11936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__); 11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala char *endPtr; 11976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 119811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 11996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 12006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 12016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 120411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 12056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 12066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 12076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 121011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 12116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 12126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 12136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsAltitudeStr); 12146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 12176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 12186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 12196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 12206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsProcessingMethod = gpsProcMethodStr; 12236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsEnabled = true; 12256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // WHITE_BALANCE 12286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int wbMode = wbModeStringToEnum( 12296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 1230836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (wbMode != k.mParameters.wbMode) { 12316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableWbModes = 12326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 12336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 12346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (wbMode == availableWbModes.data.u8[i]) break; 12356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableWbModes.count) { 12376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 12386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 12406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // EFFECT 12456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int effectMode = effectModeStringToEnum( 12466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 1247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (effectMode != k.mParameters.effectMode) { 12486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableEffectModes = 12496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 12506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 12516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (effectMode == availableEffectModes.data.u8[i]) break; 12526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableEffectModes.count) { 12546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 12556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 12576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ANTIBANDING 12626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int antibandingMode = abModeStringToEnum( 12636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 1264836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (antibandingMode != k.mParameters.antibandingMode) { 12656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableAbModes = 12666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 12676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 12686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (antibandingMode == availableAbModes.data.u8[i]) break; 12696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableAbModes.count) { 12716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 12726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 12746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // SCENE_MODE 12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int sceneMode = sceneModeStringToEnum( 12806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 1281836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (sceneMode != k.mParameters.sceneMode) { 12826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableSceneModes = 12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 12846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 12856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (sceneMode == availableSceneModes.data.u8[i]) break; 12866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableSceneModes.count) { 12886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 12896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 12916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FLASH_MODE 12966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::flashMode_t flashMode = flashModeStringToEnum( 12976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 1298836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (flashMode != k.mParameters.flashMode) { 12996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t flashAvailable = 13006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 13016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (!flashAvailable.data.u8[0] && 13026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala flashMode != Parameters::FLASH_MODE_OFF) { 13036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 13046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "No flash on device", __FUNCTION__, 13056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 13066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) { 13086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableAeModes = 13096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 13106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 13116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (flashMode == availableAeModes.data.u8[i]) break; 13126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableAeModes.count) { 13146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 13156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 13166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 13176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (flashMode == -1) { 13206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 13216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 13226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 13236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FOCUS_MODE 13286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::focusMode_t focusMode = focusModeStringToEnum( 13296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 1330836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (focusMode != k.mParameters.focusMode) { 13316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode != Parameters::FOCUS_MODE_FIXED) { 13326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t minFocusDistance = 13336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE); 13346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 13356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 13366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "fixed focus lens", 13376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 13386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 13396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) { 13416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFocusModes = 13426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 13436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 13446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode == availableFocusModes.data.u8[i]) break; 13456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFocusModes.count) { 13476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 13486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 13496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 13506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FOCUS_AREAS 13576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> focusingAreas; 13586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 13596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala &focusingAreas); 13606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t max3aRegions = 13616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 13626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 13636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res != OK) { 13646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 13656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 13666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // EXPOSURE_COMPENSATION 13706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int exposureCompensation = 13716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 13726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t exposureCompensationRange = 13736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE); 13746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (exposureCompensation < exposureCompensationRange.data.i32[0] || 13756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala exposureCompensation > exposureCompensationRange.data.i32[1]) { 13766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 13776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, exposureCompensation); 13786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // AUTO_EXPOSURE_LOCK (always supported) 13826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool autoExposureLock = boolFromString( 13836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 13846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // AUTO_WHITEBALANCE_LOCK (always supported) 13866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool autoWhiteBalanceLock = boolFromString( 13876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 13886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // METERING_AREAS 13906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> meteringAreas; 13916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 13926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala &meteringAreas); 13936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 13946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res != OK) { 13956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 13966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 13976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 13986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ZOOM 14026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 14036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) { 14046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested zoom level %d is not supported", 14056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, zoom); 14066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // VIDEO_SIZE 14106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int videoWidth, videoHeight; 14116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getVideoSize(&videoWidth, &videoHeight); 1412836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (videoWidth != k.mParameters.videoWidth || 1413836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala videoHeight != k.mParameters.videoHeight) { 14146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState == RECORD) { 14156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Video size cannot be updated when recording is active!", 14166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__); 14176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableVideoSizes = 14206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 14216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableVideoSizes.count; i += 2 ) { 14226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableVideoSizes.data.i32[i] == videoWidth && 14236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availableVideoSizes.data.i32[i+1] == videoHeight) break; 14246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableVideoSizes.count) { 14266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested video size %d x %d is not supported", 14276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, videoWidth, videoHeight); 14286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // RECORDING_HINT (always supported) 14336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool recordingHint = boolFromString( 14346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 14356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // VIDEO_STABILIZATION 14376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool videoStabilization = boolFromString( 14386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 14396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableVideoStabilizationModes = 14406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 14416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (videoStabilization && availableVideoStabilizationModes.count == 1) { 14426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 14436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala /** Update internal parameters */ 14469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1447836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth = previewWidth; 1448836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewHeight = previewHeight; 1449836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0] = previewFpsRange[0]; 1450836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1] = previewFpsRange[1]; 1451836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFps = previewFps; 1452836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFormat = previewFormat; 1453836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1454836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureWidth = pictureWidth; 1455836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight = pictureHeight; 1456836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1457836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0] = jpegThumbSize[0]; 1458836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1] = jpegThumbSize[1]; 1459836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality = jpegQuality; 1460836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality = jpegThumbQuality; 1461836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1462836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsEnabled = gpsEnabled; 1463836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[0] = gpsCoordinates[0]; 1464836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[1] = gpsCoordinates[1]; 1465836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[2] = gpsCoordinates[2]; 1466836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsTimestamp = gpsTimestamp; 1467836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsProcessingMethod = gpsProcessingMethod; 1468836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1469836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.wbMode = wbMode; 1470836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.effectMode = effectMode; 1471836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.antibandingMode = antibandingMode; 1472836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.sceneMode = sceneMode; 1473836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1474836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = flashMode; 1475174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (focusMode != k.mParameters.focusMode) { 1476174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.currentAfTriggerId = -1; 1477174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1478836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = focusMode; 1479836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1480836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas = focusingAreas; 1481836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation = exposureCompensation; 1482836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoExposureLock = autoExposureLock; 1483836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock; 1484836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.meteringAreas = meteringAreas; 1485836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.zoom = zoom; 1486836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1487836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoWidth = videoWidth; 1488836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoHeight = videoHeight; 1489836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1490836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.recordingHint = recordingHint; 1491836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoStabilization = videoStabilization; 1492836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1493836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updatePreviewRequest(k.mParameters); 1494be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1495be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 1496be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1497be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1498be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 1499836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateCaptureRequest(k.mParameters); 1500be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1501be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)", 1502be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1503be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1504be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 1505be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 1506836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRecordingRequest(k.mParameters); 15079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 15089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 15099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 15119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 15129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mState == PREVIEW) { 1514be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 1515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1516be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 1517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 15209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } else if (mState == RECORD || mState == VIDEO_SNAPSHOT) { 15219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mRecordingRequest); 15229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 15239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 15249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 15269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 1527be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 15286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 1529836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.paramsFlattened = params; 15309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 153261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 1533f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 153461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const { 1535a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1536ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 15373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return String8(); 1538ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 1539836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::ReadKey k(mParameters); 1540ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 15413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala // TODO: Deal with focus distances 1542836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala return k.mParameters.paramsFlattened; 154361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 154461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 154561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1546a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1547ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 15483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 15493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1550c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1551c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1552c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala cmd, arg1, arg2); 1553c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 155436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala switch (cmd) { 155536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_SMOOTH_ZOOM: 155636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartSmoothZoomL(); 155736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_STOP_SMOOTH_ZOOM: 155836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStopSmoothZoomL(); 155936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_DISPLAY_ORIENTATION: 156036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetDisplayOrientationL(arg1); 156136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_SHUTTER_SOUND: 156236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableShutterSoundL(arg1 == 1); 156336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PLAY_RECORDING_SOUND: 156436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPlayRecordingSoundL(); 156536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_FACE_DETECTION: 156636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartFaceDetectionL(arg1); 156736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_STOP_FACE_DETECTION: 156836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStopFaceDetectionL(); 156936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG: 157036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableFocusMoveMsgL(arg1 == 1); 157136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PING: 157236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPingL(); 157336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT: 157436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetVideoBufferCountL(arg1); 157536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala default: 157636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unknown command %d (arguments %d, %d)", 157736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, cmd, arg1, arg2); 1578c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 157936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 158036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 158136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 158236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() { 158336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 158436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 158536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 158636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 158736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() { 158836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 158936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 159036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 159136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 159236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) { 159336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala LockedParameters::Key k(mParameters); 159436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala int transform = degToTransform(degrees, 159536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 159636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (transform == -1) { 159736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as display orientation value", 159836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, mCameraId, degrees); 159936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return BAD_VALUE; 160036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 160136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (transform != k.mParameters.previewTransform && 160236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mPreviewStreamId != NO_STREAM) { 160336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mDevice->setStreamTransform(mPreviewStreamId, transform); 160436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 160536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala k.mParameters.previewTransform = transform; 160636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 160736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 160836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 160936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) { 161036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala LockedParameters::Key k(mParameters); 161136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (enable) { 161236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala k.mParameters.playShutterSound = true; 1613c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return OK; 161436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1615983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 161636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound may not be allowed. In that case only 161736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // allow the mediaserver process to disable the sound. 161836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala char value[PROPERTY_VALUE_MAX]; 161936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala property_get("ro.camera.sound.forced", value, "0"); 162036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (strncmp(value, "0", 2) != 0) { 162136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound is not allowed. Deny if the current 162236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // process is not mediaserver. 162336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (getCallingPid() != getpid()) { 162436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("Failed to disable shutter sound. Permission denied (pid %d)", 162536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala getCallingPid()); 162636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return PERMISSION_DENIED; 1627983cf231ab2d176a14595cdae46ff1b0c239af47James Dong } 162836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1629983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 163036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala k.mParameters.playShutterSound = false; 163136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 163236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 1633983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 163436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() { 163536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 163636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 163736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 163836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 163936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartFaceDetectionL(int type) { 164036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 164136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 164236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 164336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 164436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL() { 164536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 164636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 164736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 164836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 164936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) { 1650174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala LockedParameters::Key k(mParameters); 1651174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.enableFocusMoveMessages = enable; 1652174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 165336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 165436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 165536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 165636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() { 165736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Always ping back if access is proper and device is alive 165836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (mState != DISCONNECTED) { 1659983cf231ab2d176a14595cdae46ff1b0c239af47James Dong return OK; 166036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } else { 166136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return NO_INIT; 166236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 166336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 166436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 166536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) { 16668da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong if (recordingEnabledL()) { 166736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting video buffer count after " 166836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala "recording was started", __FUNCTION__, mCameraId); 166936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return INVALID_OPERATION; 1670c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1671c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 167236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // 32 is the current upper limit on the video buffer count for BufferQueue 167336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (count > 32) { 167436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as video buffer count value", 167536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, mCameraId, count); 167636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return BAD_VALUE; 167736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 167836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 167936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Need to reallocate memory for heap 168036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (mRecordingHeapCount != count) { 168136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (mRecordingHeap != 0) { 168236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mRecordingHeap.clear(); 168336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mRecordingHeap = NULL; 168436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 168536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mRecordingHeapCount = count; 168636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1687c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 16886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 168961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 169061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 16913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */ 16923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1693160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) { 1694160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2); 1695160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1696160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1697160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) { 1698160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__, 1699160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala frameNumber, timestamp); 1700160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1701160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1702160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) { 1703160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autofocus state now %d, last trigger %d", 1704160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1705174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendCompletedMessage = false; 1706174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendMovingMessage = false; 1707174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1708174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool success = false; 1709174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool afInMotion = false; 1710174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 1711174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala LockedParameters::Key k(mParameters); 1712174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (k.mParameters.focusMode) { 1713174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 1714174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 1715174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for the current AF 1716174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // trigger. For example, if cancel was called in between, or if we 1717174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // already sent a notification about this AF call. 1718174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (triggerId != k.mParameters.currentAfTriggerId) break; 1719174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1720174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1721174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1722174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1723174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1724174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 1725174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.currentAfTriggerId = -1; 1726174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1727174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 1728174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Just starting focusing, ignore 1729174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1730174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1731174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1732174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1733174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1734174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Unexpected in AUTO/MACRO mode 1735174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d", 1736174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, newState); 1737174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1738174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1739174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1740174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1741174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1742174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1743174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1744174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1745174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1746174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1747174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for 1748174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // the current AF trigger. For example, if cancel was 1749174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // called in between, or if we already sent a 1750174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // notification about this AF call. 1751174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Send both a 'AF done' callback and a 'AF move' callback 1752174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (triggerId != k.mParameters.currentAfTriggerId) break; 1753174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 1754174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 1755174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (k.mParameters.enableFocusMoveMessages && 1756174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.afInMotion) { 1757174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1758174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1759174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.currentAfTriggerId = -1; 1760174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1761174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1762174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Cancel was called, or we switched state; care if 1763174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // currently moving 1764174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 1765174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (k.mParameters.enableFocusMoveMessages && 1766174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.afInMotion) { 1767174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1768174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1769174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1770174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1771174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Start passive scan, inform upstream 1772174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = true; 1773174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1774174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1775174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Stop passive scan, inform upstream 1776174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (k.mParameters.enableFocusMoveMessages) { 1777174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1778174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1779174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1780174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1781174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.afInMotion = afInMotion; 1782174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1783174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 1784174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 1785174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 1786174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1787174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) { 1788174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Unexpected AF state change %d (ID %d) in focus mode %d", 1789174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, newState, triggerId, k.mParameters.focusMode); 1790174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1791174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1792174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1793174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (sendMovingMessage) { 1794174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE, 1795174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion ? 1 : 0, 0); 1796174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1797603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala if (sendCompletedMessage) { 1798603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, success ? 1 : 0, 0); 1799603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala } 1800160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1801160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1802160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) { 1803160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autoexposure state now %d, last trigger %d", 1804160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1805160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1806160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1807160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) { 1808160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Auto-whitebalance state now %d, last trigger %d", 1809160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1810160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1811160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1812d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() { 1813d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 1814d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 1815d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala sp<ICameraClient> currentClient; 18169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId); 18179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1818d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala CpuConsumer::LockedBuffer imgBuffer; 1819d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala { 1820d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 1821d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1822d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Signal errors here upstream 1823d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) { 1824d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly!", 1825d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 1826d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1827d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1828d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1829d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mCaptureConsumer->lockNextBuffer(&imgBuffer); 1830d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1831d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)", 1832d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1833d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1834d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1835d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1836d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) { 1837d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected format for still image: " 1838d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%x, expected %x", __FUNCTION__, mCameraId, 1839d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala imgBuffer.format, 1840d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala HAL_PIXEL_FORMAT_BLOB); 1841d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 1842d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1843d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1844d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1845d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Optimize this to avoid memcopy 18469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala void* captureMemory = mCaptureHeap->mHeap->getBase(); 18479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size = mCaptureHeap->mHeap->getSize(); 1848d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala memcpy(captureMemory, imgBuffer.data, size); 1849d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1850d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 1851d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1852d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala currentClient = mCameraClient; 1853d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 1854d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 1855d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STOPPED; 1856d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case VIDEO_SNAPSHOT: 1858d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = RECORD; 1859d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1860d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 1861d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__, 1862d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCameraId, mState); 1863d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1864d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1865d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1866d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Call outside mICameraLock to allow re-entrancy from notification 1867d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (currentClient != 0) { 1868d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 18699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureHeap->mBuffers[0], NULL); 18709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 18719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 18729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 18739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() { 18749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ATRACE_CALL(); 18759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 18769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<ICameraClient> currentClient; 18779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t heapIdx = 0; 18789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala nsecs_t timestamp; 18799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala { 18809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala Mutex::Autolock icl(mICameraLock); 18819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Signal errors here upstream 1882898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala bool discardData = false; 18839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RECORD && mState != VIDEO_SNAPSHOT) { 1884898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala ALOGV("%s: Camera %d: Discarding recording image buffers received after " 1885898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala "recording done", 18869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 1887898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala discardData = true; 18889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 18899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 189078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala buffer_handle_t imgBuffer; 189178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala res = mRecordingConsumer->getNextBuffer(&imgBuffer, ×tamp); 18929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 18939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)", 18949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 18959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 18969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 18979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1898898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala if (discardData) { 189978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mRecordingConsumer->freeBuffer(imgBuffer); 19009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 19019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 1902898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 190378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (mRecordingHeap == 0) { 190478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala const size_t bufferSize = 4 + sizeof(buffer_handle_t); 19059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Creating recording heap with %d buffers of " 19069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "size %d bytes", __FUNCTION__, mCameraId, 1907983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingHeapCount, bufferSize); 19089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingHeap != 0) { 19099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Previous heap has size %d " 19109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "(new will be %d) bytes", __FUNCTION__, mCameraId, 19119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mHeap->getSize(), 1912983cf231ab2d176a14595cdae46ff1b0c239af47James Dong bufferSize * mRecordingHeapCount); 19139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 19149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Need to allocate memory for heap 19159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap.clear(); 19169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1917983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount, 19189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "Camera2Client::RecordingHeap"); 19199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingHeap->mHeap->getSize() == 0) { 19209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for recording", 19219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 192278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mRecordingConsumer->freeBuffer(imgBuffer); 19239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 19249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 19259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapHead = 0; 1926983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingHeapFree = mRecordingHeapCount; 19279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 19289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 19299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if ( mRecordingHeapFree == 0) { 19309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: No free recording buffers, dropping frame", 19319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 193278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mRecordingConsumer->freeBuffer(imgBuffer); 19339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 19349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 19359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala heapIdx = mRecordingHeapHead; 1936983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount; 19379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree--; 19389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 19399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Timestamp %lld", 19409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, timestamp); 19419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 19429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ssize_t offset; 19439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size; 19449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<IMemoryHeap> heap = 19459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset, 19469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &size); 19479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 194878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint8_t *data = (uint8_t*)heap->getBase() + offset; 194978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint32_t type = kMetadataBufferTypeGrallocSource; 195078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala memcpy(data, &type, 4); 195178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala memcpy(data + 4, &imgBuffer, sizeof(buffer_handle_t)); 195278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGV("%s: Camera %d: Sending out buffer_handle_t %p", 1953803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala __FUNCTION__, mCameraId, imgBuffer); 19549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala currentClient = mCameraClient; 19559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 19569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Call outside mICameraLock to allow re-entrancy from notification 19579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (currentClient != 0) { 19589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala currentClient->dataCallbackTimestamp(timestamp, 19599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala CAMERA_MSG_VIDEO_FRAME, 19609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mBuffers[heapIdx]); 1961d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1962d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 1963d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 19643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag, 19653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala size_t minCount, size_t maxCount) { 19663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala status_t res; 19673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t entry; 19683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala res = find_camera_metadata_entry(mDevice->info(), 19693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tag, 19703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala &entry); 19713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 19723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 19733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 19743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 19753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 19763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 19773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)", 19783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tagSection, tagName, tag, strerror(-res), res); 19793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.count = 0; 19803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.data.u8 = NULL; 19813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } else if (CC_UNLIKELY( 19823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 19833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 19843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 19853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 19863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 19873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 19883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 19893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "Expected between %d and %d values, but got %d values", 19903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 19913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.count = 0; 19923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.data.u8 = NULL; 19933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } 19943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 19953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return entry; 19963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala} 19973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 19983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */ 19993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2000f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2001f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() { 2002a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 2003836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 2004ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 2005f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 20063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters params; 2007f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 20083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableProcessedSizes = 20093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2); 20103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableProcessedSizes.count) return NO_INIT; 2011f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2012f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick more intelligently 2013836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth = availableProcessedSizes.data.i32[0]; 2014836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewHeight = availableProcessedSizes.data.i32[1]; 2015836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoWidth = k.mParameters.previewWidth; 2016836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoHeight = k.mParameters.previewHeight; 20173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2018836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setPreviewSize(k.mParameters.previewWidth, k.mParameters.previewHeight); 2019836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setVideoSize(k.mParameters.videoWidth, k.mParameters.videoHeight); 20203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 20213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8::format("%dx%d", 2022836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth, k.mParameters.previewHeight)); 2023f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2024f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewSizes; 2025f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableProcessedSizes.count; i += 2) { 2026f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewSizes += ","; 2027f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes += String8::format("%dx%d", 2028f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableProcessedSizes.data.i32[i], 2029f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableProcessedSizes.data.i32[i+1]); 2030f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 20313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 2032f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes); 20333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 2034f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes); 2035f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2036f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 20373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFpsRanges = 20383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 20393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableFpsRanges.count) return NO_INIT; 2040f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2041836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0]; 2042836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1]; 2043f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 20443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 20453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8::format("%d,%d", 2046836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0], 2047836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1])); 2048f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2049f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2050f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFpsRange; 2051f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 2052f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewFpsRange += ","; 2053f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFpsRange += String8::format("(%d,%d)", 2054f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i], 2055f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i+1]); 2056f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 20573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 2058f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFpsRange); 2059f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2060f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2061836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 20623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FORMAT, 2063836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala formatEnumToString(k.mParameters.previewFormat)); // NV21 20643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2065836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewTransform = degToTransform(0, 2066c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 2067c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 20683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFormats = 20693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 2070f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2071f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2072f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFormats; 2073f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2074f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFormats.count; i++) { 2075f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedPreviewFormats += ","; 2076f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2077f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableFormats.data.i32[i]) { 2078f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: 2079bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 2080bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422SP; 2081f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2082f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: 2083bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 2084bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 2085f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2086f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: 2087bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 2088bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422I; 2089f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2090f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: 2091bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 2092bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 2093f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2094f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 2095bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 2096bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGB565; 2097f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 209811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 209911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala supportedPreviewFormats += 210011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGBA8888; 210111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala break; 210211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 2103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 210411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 2105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 210711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala 2108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown preview format: %x", 2110f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableFormats.data.i32[i]); 2111f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2112f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2113f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 21153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 2116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFormats); 2117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2118f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2119f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 2120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // still have to do something sane for them 2121f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 2123836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0]); 2124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFrameRates; 2127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 2128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewFrameRates += ","; 2129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 2130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i]); 2131f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 21323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 2133f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFrameRates); 2134f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2135f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableJpegSizes = 21373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 21383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableJpegSizes.count) return NO_INIT; 2139f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick maximum 2141836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureWidth = availableJpegSizes.data.i32[0]; 2142836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight = availableJpegSizes.data.i32[1]; 2143f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2144836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setPictureSize(k.mParameters.pictureWidth, 2145836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight); 2146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2147f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2148f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPictureSizes; 2149f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableJpegSizes.count; i += 2) { 2150f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 2151f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 2152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegSizes.data.i32[i], 2153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegSizes.data.i32[i+1]); 2154f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 21553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 2156f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPictureSizes); 2157f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2158f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 21603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 21613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 2162f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableJpegThumbnailSizes = 21643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2); 21653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 2166f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2167f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick default thumbnail size sensibly 2168836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0]; 2169836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1]; 2170f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 21713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 2172836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0]); 21733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 2174836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1]); 2175f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2176f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2177f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedJpegThumbSizes; 2178f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 2179f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 2180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 2181f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 2182f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 2183f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 21843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 2185f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedJpegThumbSizes); 2186f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2187f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality = 90; 21893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 2190836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality); 2191836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality = 90; 21923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 2193836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality); 2194836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegRotation = 0; 21953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 2196836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegRotation); 21973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2198836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsEnabled = false; 2199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsProcessingMethod = "unknown"; 22003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 22013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO; 22033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 22043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 22053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 22063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableWhiteBalanceModes = 22073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 2208f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2209f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedWhiteBalance; 2210f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2211f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 2212f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 2213f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2214f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 2215f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_AUTO: 2216bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2217bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 2218f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2219f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_INCANDESCENT: 2220bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2221bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 2222f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2223f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_FLUORESCENT: 2224bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2225bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 2226f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2227f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 2228bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2229bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 2230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_DAYLIGHT: 2232bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2233bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 2234f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2235f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 2236bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2237bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 2238f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2239f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_TWILIGHT: 2240bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2241bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 2242f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2243f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_SHADE: 2244bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2245bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 2246f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2247f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Skipping values not mappable to v1 API 2248f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_OFF: 2249f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2250f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2251f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2252f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 2253f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, 2254f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 2255f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2256f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2257f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2258f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 22593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 2260f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedWhiteBalance); 2261f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2262f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2263836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF; 22643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 22653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::EFFECT_NONE); 22663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 22673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableEffects = 22683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 22693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableEffects.count) return NO_INIT; 2270f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2271f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedEffects; 2272f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2273f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 2274f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedEffects += ","; 2275f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2276f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 2277f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_OFF: 2278bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2279bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_NONE; 2280f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2281f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_MONO: 2282bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2283bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_MONO; 2284bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala break; 2285f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_NEGATIVE: 2286bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2287bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 2288f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2289f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SOLARIZE: 2290bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2291bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 2292f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2293f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SEPIA: 2294bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2295bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_SEPIA; 2296f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2297f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_POSTERIZE: 2298bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2299bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 2300f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2301f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_WHITEBOARD: 2302bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2303bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 2304f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2305f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_BLACKBOARD: 2306bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2307bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 2308f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2309f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_AQUA: 2310bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2311bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_AQUA; 2312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2313f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2314f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 2315f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableEffects.data.u8[i]); 2316f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2317f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2318f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2319f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 23203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 2321f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2323836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 23243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 23253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 23263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 23273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAntibandingModes = 23283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 23293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAntibandingModes.count) return NO_INIT; 2330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2331f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedAntibanding; 2332f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2333f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 2334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 2335f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 2337f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_OFF: 2338bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2339bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 2340f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_50HZ: 2342bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2343bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 2344f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2345f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_60HZ: 2346bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2347bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 2348f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2349f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_AUTO: 2350bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2351bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 2352f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2353f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 2355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, 2356f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 2357f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2358f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2359f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 23613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 2362f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedAntibanding); 2363f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2364f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2365836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.sceneMode = ANDROID_CONTROL_OFF; 23663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 23673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 23683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 23693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableSceneModes = 23703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 23713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableSceneModes.count) return NO_INIT; 2372f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2373bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 2374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = true; 2375f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool noSceneModes = false; 2376f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 2377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 2378f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2379f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 2380f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala noSceneModes = true; 2382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 2384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Not in old API 2385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2386f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2387f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 2388bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2389bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 2390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 2392bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2393bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 2394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2395f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 2396bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2397bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 2398f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2399f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 2400bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2401bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 2402f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 2404bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2405bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 2406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 2408bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2409bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 2410f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 2412bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2413bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 2414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2415f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 2416bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2417bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 2418f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2419f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 2420bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2421bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 2422f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2423f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 2424bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2425bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 2426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 2428bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2429bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 2430f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2431f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 2432bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2433bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 2434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 2436bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2437bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 2438f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2439f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 2440bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2441bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 2442f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2443f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 2444bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2445bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 2446f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2447f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 2449bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala __FUNCTION__, mCameraId, 2450bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala availableSceneModes.data.u8[i]); 2451f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2452f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2453f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (!noSceneModes) { 24563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 2457f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedSceneModes); 2458f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2459f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 24613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t flashAvailable = 24623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 24633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!flashAvailable.count) return NO_INIT; 2464f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 24653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAeModes = 24663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 24673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAeModes.count) return NO_INIT; 2468f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2469f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (flashAvailable.data.u8[0]) { 2470836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = Parameters::FLASH_MODE_AUTO; 24713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 24723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_AUTO); 24733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 24743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 24753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 24763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 24773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 24783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 2479f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 2480f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (availableAeModes.data.u8[i] == 2481f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) { 24823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 24833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 2484f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2485f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2486f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 24873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 2488f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedFlashModes); 24893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } else { 2490836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = Parameters::FLASH_MODE_OFF; 24913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 24923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 24933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 24943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 2495f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2496f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 24973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t minFocusDistance = 24983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1); 24993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!minFocusDistance.count) return NO_INIT; 25003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 25013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAfModes = 25023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 25033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAfModes.count) return NO_INIT; 25043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2505f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 2506f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Fixed-focus lens 2507836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = Parameters::FOCUS_MODE_FIXED; 25083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 25093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 25103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 25113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 2512f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 2513836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 25143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 25153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 2516174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY); 2517f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = true; 2518bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 2519f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 2520f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 2521f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2522f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 2523f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_AUTO: 2524bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2525bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 2526f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_MACRO: 2528bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2529bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 2530f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2531f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 2532bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2533bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 2534f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 2536bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2537bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 2538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_EDOF: 2540bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2541bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 2542f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2543bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala // Not supported in old API 2544f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_OFF: 2545f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2546f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2547f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2548f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 2549f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableAfModes.data.u8[i]); 2550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 25543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 2555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedFocusModes); 2556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 25583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t max3aRegions = 25593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 25603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!max3aRegions.count) return NO_INIT; 2561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 25623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 2563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala max3aRegions.data.i32[0]); 25643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 2565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "(0,0,0,0,0)"); 2566836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas.clear(); 2567836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0)); 25683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 25693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFocalLengths = 25703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS); 25713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 2572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float minFocalLength = availableFocalLengths.data.f[0]; 25743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 2575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 25763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t sensorSize = 25773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2); 25783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!sensorSize.count) return NO_INIT; 2579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // The fields of view here assume infinity focus, maximum wide angle 2581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float horizFov = 180 / M_PI * 2582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength)); 2583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float vertFov = 180 / M_PI * 2584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength)); 25853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 25863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 2587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2588836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation = 0; 25893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 2590836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation); 2591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 25923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t exposureCompensationRange = 25933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2); 25943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 25953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 25963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 2597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 25983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 2599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 2600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 26013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t exposureCompensationStep = 26023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1); 26033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 26043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 26053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 2606d6f8e08a9ca7f2fe41717acd351426a7ecb0c175Eino-Ville Talvala (float)exposureCompensationStep.data.r[0].numerator / 2607f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 2608f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2609836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoExposureLock = false; 26103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 26113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 26123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 26133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2614f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2615836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoWhiteBalanceLock = false; 26163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 26173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 26183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 26193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2620f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2621836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 26223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 2623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala max3aRegions.data.i32[0]); 26243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 2625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "(0,0,0,0,0)"); 2626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2627836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.zoom = 0; 2628836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.set(CameraParameters::KEY_ZOOM, k.mParameters.zoom); 26293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 2630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 26313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t maxDigitalZoom = 26323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1); 26333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 2634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 zoomRatios; 2637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float zoom = 1.f; 2638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 26396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala (NUM_ZOOM_STEPS-1); 2640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 26416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 2642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) zoomRatios += ","; 2643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 2645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala zoom += zoomIncrement; 2646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 26473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 2648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2649f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 26503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 26513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 26523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 26533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 26553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 2656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "Infinity,Infinity,Infinity"); 2657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 26583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t maxFacesDetected = 26593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1); 26603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 2661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala maxFacesDetected.data.i32[0]); 26623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 2663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 0); 2664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 26653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 266678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 2667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 26683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 26693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 2670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 26713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 26723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 26743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 26753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 26763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 26773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableVideoStabilizationModes = 26783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 26793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableVideoStabilizationModes.count) return NO_INIT; 2680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2681f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 26823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 26833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 26853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 26863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 2687f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 268936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Set up initial state for non-Camera.Parameters state variables 269036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 2691836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.storeMetadataInBuffers = true; 269236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala k.mParameters.playShutterSound = true; 2693174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.afTriggerCounter = 0; 2694174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.currentAfTriggerId = -1; 269578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 2696836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.paramsFlattened = params.flatten(); 26973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 2699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 270061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 2701836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters ¶ms) { 2702be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2703be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2704836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 2705be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 2706be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Check if stream parameters have to change 2707be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint32_t currentWidth, currentHeight; 2708be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->getStreamInfo(mPreviewStreamId, 2709be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ¤tWidth, ¤tHeight, 0); 2710be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2711be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error querying preview stream info: " 2712be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2713be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2714be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2715836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.previewWidth || 2716836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.previewHeight) { 27179e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d", 27189e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId, currentWidth, currentHeight, 2719836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth, params.previewHeight); 2720be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->waitUntilDrained(); 2721be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2722be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error waiting for preview to drain: " 2723be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2724be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2725be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2726be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->deleteStream(mPreviewStreamId); 2727be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2728be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 2729be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "for preview: %s (%d)", __FUNCTION__, mCameraId, 2730be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2731be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2732be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2733be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewStreamId = NO_STREAM; 2734be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2735be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2736be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2737be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewStreamId == NO_STREAM) { 2738be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->createStream(mPreviewWindow, 2739836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth, params.previewHeight, 2740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, 2741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mPreviewStreamId); 2742be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2743be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)", 2744be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 2745be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2746be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2747be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2748be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2749c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = mDevice->setStreamTransform(mPreviewStreamId, 2750836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewTransform); 2751c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (res != OK) { 2752c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview stream transform: " 2753c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2754c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return res; 2755c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 2756c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 2757be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 2758be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2759be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2760836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters ¶ms) { 2761a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 27626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 27636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mPreviewRequest == NULL) { 27646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 27656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &mPreviewRequest); 27666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 27676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default preview request: " 27686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 27696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 27706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 27716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2772be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2773836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRequestCommon(mPreviewRequest, params); 2774be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2775be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of preview " 2776be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 2777be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2778be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2779be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2780be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 27816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 27826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 27836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 2784836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureStream(const Parameters ¶ms) { 2785be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2786d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 2787d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Find out buffer size for JPEG 2788d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_entry_t maxJpegSize = 2789d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala staticInfo(ANDROID_JPEG_MAX_SIZE); 2790d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (maxJpegSize.count == 0) { 2791d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!", 2792d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 2793d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 2794d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2795d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2796d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureConsumer == 0) { 2797d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Create CPU buffer queue endpoint 2798d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer = new CpuConsumer(1); 2799d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this)); 2800d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer")); 2801d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureWindow = new SurfaceTextureClient( 2802d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->getProducerInterface()); 2803d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Create memory for API consumption 28049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1, 28059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "Camera2Client::CaptureHeap"); 28069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mCaptureHeap->mHeap->getSize() == 0) { 2807d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for capture", 2808d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 2809d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return NO_MEMORY; 2810d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2811d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2812d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2813be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mCaptureStreamId != NO_STREAM) { 2814d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Check if stream parameters have to change 2815d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t currentWidth, currentHeight; 2816d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->getStreamInfo(mCaptureStreamId, 2817d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ¤tWidth, ¤tHeight, 0); 2818d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2819d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying capture output stream info: " 2820d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2821d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2822d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2823836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.pictureWidth || 2824836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.pictureHeight) { 2825d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->deleteStream(mCaptureStreamId); 2826d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2827d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 2828d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "for capture: %s (%d)", __FUNCTION__, mCameraId, 2829d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala strerror(-res), res); 2830d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2831d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2832d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId = NO_STREAM; 2833d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2834d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2835be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2836be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mCaptureStreamId == NO_STREAM) { 2837be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Create stream for HAL production 2838be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->createStream(mCaptureWindow, 2839836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.pictureWidth, params.pictureHeight, 2840be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0], 2841be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mCaptureStreamId); 2842be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2843be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for capture: " 2844be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2845be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2846be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2847be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2848be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2849d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 2850d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 2851be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2852836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest(const Parameters ¶ms) { 2853d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 2854d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 2855d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureRequest == NULL) { 2856d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE, 2857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala &mCaptureRequest); 2858d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2859d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 2860d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2861d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2862d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2863d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2864be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2865836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRequestCommon(mCaptureRequest, params); 2866be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2867be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 2868be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 2869be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2870be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2871be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2872be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2873be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2874be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_THUMBNAIL_SIZE, 2875836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.jpegThumbSize, 2); 2876be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2877be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2878be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_THUMBNAIL_QUALITY, 2879836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegThumbQuality, 1); 2880be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2881be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2882be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_QUALITY, 2883836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegQuality, 1); 2884be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2885be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2886be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_ORIENTATION, 2887836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegRotation, 1); 2888be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2889be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2890836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.gpsEnabled) { 2891be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2892be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 2893836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.gpsCoordinates, 3); 2894be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2895be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2896be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 2897836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.gpsTimestamp, 1); 2898be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2899be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2900be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 2901836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.gpsProcessingMethod.string(), 2902836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.gpsProcessingMethod.size()); 2903be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2904be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else { 2905be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2906be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES); 2907be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2908be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2909be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP); 2910be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2911be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2912be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD); 2913be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2914be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2915be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2916d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 2917d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 2918d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2919836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters ¶ms) { 29209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ATRACE_CALL(); 29219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 29229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingRequest == NULL) { 29239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD, 29249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &mRecordingRequest); 29259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 29269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default recording request:" 29279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 29289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 29299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 29309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 29319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2932836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRequestCommon(mRecordingRequest, params); 29339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 29349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of recording " 29359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 29369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 29379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 29389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 29399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 29409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 29419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 29429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2943836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters ¶ms) { 29449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 29459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 29469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingConsumer == 0) { 29479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Create CPU buffer queue endpoint 2948983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingConsumer = new MediaConsumer(mRecordingHeapCount); 29499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this)); 29509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer")); 29519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingWindow = new SurfaceTextureClient( 29529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->getProducerInterface()); 29539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Allocate memory later, since we don't know buffer size until receipt 29549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 29559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 29569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 29579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Check if stream parameters have to change 29589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint32_t currentWidth, currentHeight; 29599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->getStreamInfo(mRecordingStreamId, 29609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ¤tWidth, ¤tHeight, 0); 29619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 29629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error querying recording output stream info: " 29639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 29649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 29659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 2966836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.videoWidth || 2967836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.videoHeight) { 29689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Should wait to be sure previous recording has finished 29699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->deleteStream(mRecordingStreamId); 29709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 29719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 29729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "for recording: %s (%d)", __FUNCTION__, mCameraId, 29739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 29749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 29759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 29769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingStreamId = NO_STREAM; 29779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 29789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 29799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 29809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingStreamId == NO_STREAM) { 29819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->createStream(mRecordingWindow, 2982836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.videoWidth, params.videoHeight, 298378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId); 29849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 29859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for recording: " 29869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 29879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 29889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 29899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 29909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 29919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 29929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 29939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2994836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(camera_metadata_t *request, 2995836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const Parameters ¶ms) { 2996be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2997be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2998be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2999836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ANDROID_CONTROL_AE_TARGET_FPS_RANGE, params.previewFpsRange, 2); 3000be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3001be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3002836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint8_t wbMode = params.autoWhiteBalanceLock ? 3003836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ANDROID_CONTROL_AWB_LOCKED : params.wbMode; 3004be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3005be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AWB_MODE, &wbMode, 1); 3006be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3007be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3008836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ANDROID_CONTROL_EFFECT_MODE, ¶ms.effectMode, 1); 3009be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3010be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3011be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_MODE, 3012836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.antibandingMode, 1); 3013be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3014be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3015be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t controlMode = 3016836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ? 3017be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE; 3018be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3019be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_MODE, &controlMode, 1); 3020be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3021be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) { 3022be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3023be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_SCENE_MODE, 3024836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.sceneMode, 1); 3025be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3026be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3027be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3028be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t flashMode = ANDROID_FLASH_OFF; 3029be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t aeMode; 3030836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (params.flashMode) { 3031be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_OFF: 3032be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON; break; 3033be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 3034be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break; 3035be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_ON: 3036be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break; 3037be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 3038be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON; 3039be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala flashMode = ANDROID_FLASH_TORCH; 3040be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 3041be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 3042be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break; 3043be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala default: 3044be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 3045836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala mCameraId, params.flashMode); 3046be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return BAD_VALUE; 3047be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3048836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED; 3049be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3050be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3051be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_FLASH_MODE, &flashMode, 1); 3052be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3053be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3054be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_MODE, &aeMode, 1); 3055be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3056be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3057be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float focusDistance = 0; // infinity focus in diopters 3058be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t focusMode; 3059836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (params.focusMode) { 3060be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 3061be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 3062be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 3063be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 3064be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 3065836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusMode = params.focusMode; 3066be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 3067be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 3068be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 3069be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusMode = ANDROID_CONTROL_AF_OFF; 3070be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 3071be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala default: 3072be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 3073836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala mCameraId, params.focusMode); 3074be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return BAD_VALUE; 3075be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3076be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3077be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); 3078be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3079be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3080be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AF_MODE, &focusMode, 1); 3081be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3082be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3083836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala size_t focusingAreasSize = params.focusingAreas.size() * 5; 3084be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t *focusingAreas = new int32_t[focusingAreasSize]; 3085be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala for (size_t i = 0; i < focusingAreasSize; i += 5) { 3086836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 0] = params.focusingAreas[i].left; 3087836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 1] = params.focusingAreas[i].top; 3088836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 2] = params.focusingAreas[i].right; 3089836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 3] = params.focusingAreas[i].bottom; 3090836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 4] = params.focusingAreas[i].weight; 3091be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3092be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3093be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AF_REGIONS, focusingAreas,focusingAreasSize); 3094be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3095be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala delete[] focusingAreas; 3096be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3097be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3098be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_EXP_COMPENSATION, 3099836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.exposureCompensation, 1); 3100be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3101be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3102836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala size_t meteringAreasSize = params.meteringAreas.size() * 5; 3103be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t *meteringAreas = new int32_t[meteringAreasSize]; 3104be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala for (size_t i = 0; i < meteringAreasSize; i += 5) { 3105836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 0] = params.meteringAreas[i].left; 3106836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 1] = params.meteringAreas[i].top; 3107836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 2] = params.meteringAreas[i].right; 3108836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 3] = params.meteringAreas[i].bottom; 3109836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 4] = params.meteringAreas[i].weight; 3110be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3111be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3112be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_REGIONS, meteringAreas, meteringAreasSize); 3113be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3114be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3115be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3116be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AWB_REGIONS, meteringAreas, meteringAreasSize); 3117be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3118be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala delete[] meteringAreas; 3119be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3120be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Need to convert zoom index into a crop rectangle. The rectangle is 3121be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // chosen to maximize its area on the sensor 3122be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3123be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t maxDigitalZoom = 3124be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM); 3125be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 3126be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala (NUM_ZOOM_STEPS-1); 3127836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala float zoomRatio = 1 + zoomIncrement * params.zoom; 3128be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3129be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t activePixelArraySize = 3130be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2); 3131be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t arrayWidth = activePixelArraySize.data.i32[0]; 3132be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t arrayHeight = activePixelArraySize.data.i32[1]; 3133be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomLeft, zoomTop, zoomWidth, zoomHeight; 3134836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.previewWidth >= params.previewHeight) { 3135be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomWidth = arrayWidth / zoomRatio; 3136be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomHeight = zoomWidth * 3137836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewHeight / params.previewWidth; 3138be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else { 3139be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomHeight = arrayHeight / zoomRatio; 3140be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomWidth = zoomHeight * 3141836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth / params.previewHeight; 3142be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3143be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomLeft = (arrayWidth - zoomWidth) / 2; 3144be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomTop = (arrayHeight - zoomHeight) / 2; 3145be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3146be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth }; 3147be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3148be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_SCALER_CROP_REGION, cropRegion, 3); 3149be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3150be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3151be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // TODO: Decide how to map recordingHint, or whether just to ignore it 3152be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3153836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint8_t vstabMode = params.videoStabilization ? 3154be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_ON : 3155be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; 3156be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 3157be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 3158be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &vstabMode, 1); 3159be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3160be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3161be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 3162be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 3163be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3164be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateEntry(camera_metadata_t *buffer, 3165be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint32_t tag, const void *data, size_t data_count) { 3166be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t entry; 3167be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 3168be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = find_camera_metadata_entry(buffer, tag, &entry); 3169be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res == NAME_NOT_FOUND) { 3170be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = add_camera_metadata_entry(buffer, 3171be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala tag, data, data_count); 3172be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else if (res == OK) { 3173be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = update_camera_metadata_entry(buffer, 3174be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala entry.index, data, data_count, NULL); 3175be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3176be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3177be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 3178be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", 3179be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, get_camera_metadata_section_name(tag), 3180be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 3181be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3182be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 3183be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 3184be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3185be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::deleteEntry(camera_metadata_t *buffer, uint32_t tag) { 3186be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t entry; 3187be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 3188be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = find_camera_metadata_entry(buffer, tag, &entry); 3189be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res == NAME_NOT_FOUND) { 3190be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 3191be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else if (res != OK) { 3192be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error looking for entry %s.%s (%x): %s %d", 3193be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, 3194be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_section_name(tag), 3195be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 3196be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 3197be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3198be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = delete_camera_metadata_entry(buffer, entry.index); 3199be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 3200be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", 3201be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, 3202be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_section_name(tag), 3203be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 3204be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3205be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 3206be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 3207836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 32086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) { 32096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 32106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 32116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 32126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 32136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 32146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 32156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 32166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 32176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YV12 : // YV12 32186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 32196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RGB_565 : // RGB565 32206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 32216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 32226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 32236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 32246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 32256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 32266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 32273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) { 32283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char *fmt; 32293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala switch(format) { 32303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 32313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 32323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 32333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 32343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 32353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 32363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 32373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 32383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 32393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 32403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 32413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 32423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 32433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 32443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 32453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 32463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 32473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 32483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 32493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 32503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 32513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 32523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala default: 32533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 32543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala __FUNCTION__, format); 32553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = NULL; 32563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 32573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } 32583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return fmt; 32593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala} 32606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 32616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) { 32626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 32636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 32646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_AUTO : 32656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 32666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_INCANDESCENT : 32676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 32686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_FLUORESCENT : 32696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 32706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_WARM_FLUORESCENT : 32716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 32726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_DAYLIGHT : 32736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 32746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT : 32756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 32766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_TWILIGHT : 32776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 32786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_SHADE : 32796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 32806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 32816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 32826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) { 32836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 32846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 32856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_OFF : 32866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 32876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_MONO : 32886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 32896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_NEGATIVE : 32906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 32916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SOLARIZE : 32926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 32936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SEPIA : 32946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 32956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_POSTERIZE : 32966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 32976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_WHITEBOARD : 32986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 32996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_BLACKBOARD : 33006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 33016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_AQUA : 33026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 33036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 33046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 33056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) { 33066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 33076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 33086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_AUTO : 33096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 33106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_OFF : 33116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 33126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_50HZ : 33136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 33146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_60HZ : 33156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 33166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 33176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 33186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) { 33196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 33206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 33216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 33226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 33236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 33246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 33256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 33266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 33276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 33286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 33296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 33306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 33316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 33326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 33336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 33346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 33356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 33366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 33376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 33386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 33396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 33406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 33416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 33426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 33436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 33446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 33456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 33466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 33476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 33486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 33496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 33506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 33516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 33526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 33536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 33546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 33556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum( 33566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *flashMode) { 33576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 33586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 33596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 33606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 33616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 33626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 33636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_ON : 33646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 33656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 33666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 33676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 33686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 33696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 33706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 33716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum( 33726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *focusMode) { 33736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 33746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 33756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 33766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 33776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 33786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 33796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 33806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 33816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 33826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 33836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 33846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 33856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 33866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 33876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 33886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 33896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 33906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 33916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr, 33926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> *areas) { 33936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 33946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->clear(); 33956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areasCStr == NULL) { 33966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 33976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->push(); 33986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 33996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 34006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala String8 areasStr(areasCStr); 34016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 34026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala while (areaStart != 0) { 34036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 34046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala char *numEnd; 34056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int vals[NUM_FIELDS]; 34066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 34076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 34086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 34096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 34106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala area = numEnd + 1; 34116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 34126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->push(Parameters::Area( 34136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 34146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 34156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 34166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 34176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 34186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 34196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas, 34206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t maxRegions) { 34216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Definition of valid area can be found in 34226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // include/camera/CameraParameters.h 34236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 34246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() == 1) { 34256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas[0].left == 0 && 34266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].top == 0 && 34276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].right == 0 && 34286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].bottom == 0 && 34296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].weight == 0) { 34306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 34316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 34326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 34336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 34346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() > maxRegions) { 34356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Too many areas requested: %d", 34366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, areas.size()); 34376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 34386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 34396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 34406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 34416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala a != areas.end(); a++) { 34426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 34436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 34446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 34456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 34466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 34476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 34486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 34496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 34506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 34516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 34526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 34536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) { 34546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return !boolStr ? false : 34556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 34566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala false; 34576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 34586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 3459c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalaint Camera2Client::degToTransform(int degrees, bool mirror) { 3460c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (!mirror) { 3461c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (degrees == 0) return 0; 3462c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 3463c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 3464c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 3465c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 3466c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 3467c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 3468c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 3469c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 3470c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 3471c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 3472c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 3473c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 3474c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 3475c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 3476c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 3477c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return -1; 3478c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 34796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 348061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android 3481