Camera2Client.cpp revision 3a609147811105d40766f8f8f5904bf71cb123cb
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), 619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingRequest(NULL) 62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 63a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice = new Camera2Device(cameraId); 66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const { 693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala int callingPid = getCallingPid(); 703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if (callingPid == mClientPid) return NO_ERROR; 713a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala ALOGE("%s: attempt to use a locked camera from a different process" 733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid); 743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala return PERMISSION_DENIED; 753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala} 763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module) 78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 79a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 809e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = mDevice->initialize(module); 84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = buildDefaultParameters(); 91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (gLogLevel >= 1) { 98836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCameraId); 101836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ALOGD("%s", k.mParameters.paramsFlattened.string()); 102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = STOPPED; 1056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 10761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 10861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 10961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() { 110a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1114ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId); 1124ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 113f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDestructionStarted = true; 114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala // Rewrite mClientPid to allow shutdown by CameraService 1163a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mClientPid = getCallingPid(); 117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala disconnect(); 1183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 11961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 12061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 12161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) { 122611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala String8 result; 1233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", 124611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mCameraId, 125611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala getCameraClient()->asBinder().get(), 126611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mClientPid); 1277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" State: "); 1287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 1297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 130836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const Parameters& p = mParameters.unsafeUnlock(); 131836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1324ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append(getStateName(mState)); 1337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append("\n Current parameters:\n"); 1357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview size: %d x %d\n", 136836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewWidth, p.previewHeight); 1377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview FPS range: %d - %d\n", 138836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFpsRange[0], p.previewFpsRange[1]); 1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview HAL pixel format: 0x%x\n", 140836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFormat); 14111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala result.appendFormat(" Preview transform: %x\n", 142836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewTransform); 1437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Picture size: %d x %d\n", 144836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.pictureWidth, p.pictureHeight); 1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 146836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegThumbSize[0], p.jpegThumbSize[1]); 1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 148836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegQuality, p.jpegThumbQuality); 149836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation); 1507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS tags %s\n", 151836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsEnabled ? "enabled" : "disabled"); 152836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (p.gpsEnabled) { 1537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[0], p.gpsCoordinates[1], 155836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[2]); 1567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS timestamp: %lld\n", 157836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsTimestamp); 1587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS processing method: %s\n", 159836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsProcessingMethod.string()); 1607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" White balance mode: "); 163836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.wbMode) { 1647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO) 1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT) 1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT) 1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT) 1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT) 1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT) 1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT) 1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE) 1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Effect mode: "); 176836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.effectMode) { 1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF) 1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO) 1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE) 1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE) 1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA) 1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE) 1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD) 1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD) 1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA) 1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Antibanding mode: "); 190836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.antibandingMode) { 1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO) 1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF) 1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ) 1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ) 1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Scene mode: "); 199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.sceneMode) { 2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append("AUTO\n"); break; 2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Flash mode: "); 221836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.flashMode) { 2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focus mode: "); 232836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.focusMode) { 2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focusing areas:\n"); 245836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.focusingAreas.size(); i++) { 2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].left, 248836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].top, 249836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].right, 250836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].bottom, 251836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].weight); 2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Exposure compensation index: %d\n", 255836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.exposureCompensation); 2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" AE lock %s, AWB lock %s\n", 258836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoExposureLock ? "enabled" : "disabled", 259836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoWhiteBalanceLock ? "enabled" : "disabled" ); 2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Metering areas:\n"); 262836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.meteringAreas.size(); i++) { 2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 264836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].left, 265836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].top, 266836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].right, 267836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].bottom, 268836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].weight); 2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 271836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Zoom index: %d\n", p.zoom); 272836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Video size: %d x %d\n", p.videoWidth, 273836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoHeight); 2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Recording hint is %s\n", 276836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.recordingHint ? "set" : "not set"); 2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Video stabilization is %s\n", 279836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoStabilization ? "enabled" : "disabled"); 2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current streams:\n"); 2823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Preview stream ID: %d\n", mPreviewStreamId); 2833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Capture stream ID: %d\n", mCaptureStreamId); 284836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Recording stream ID: %d\n", mRecordingStreamId); 2853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current requests:\n"); 2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mPreviewRequest != NULL) { 2883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Preview request:\n"); 2893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 290428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(mPreviewRequest, fd, 2, 6); 2913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 2923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Preview request: undefined\n"); 2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mCaptureRequest != NULL) { 2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Capture request:\n"; 2983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 299428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(mCaptureRequest, fd, 2, 6); 3003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 3013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Capture request: undefined\n"; 3023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 3033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 3043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 305428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala if (mRecordingRequest != NULL) { 306428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala result = " Recording request:\n"; 307428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala write(fd, result.string(), result.size()); 308428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(mRecordingRequest, fd, 2, 6); 309428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala } else { 310428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala result = " Recording request: undefined\n"; 311428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala write(fd, result.string(), result.size()); 312428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala } 313428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala 3143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Device dump:\n"; 315611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala write(fd, result.string(), result.size()); 3167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t res = mDevice->dump(fd, args); 3183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (res != OK) { 3193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Error dumping device: %s (%d)", 3203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala strerror(-res), res); 3213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 3223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 3237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM 325611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala return NO_ERROR; 32661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 32761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3284ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) { 3294ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 3304ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala switch(state) { 3313a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala CASE_ENUM_TO_CHAR(DISCONNECTED) 3324ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 3334ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 3344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 3354ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 3364ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 3374ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 3384ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala default: 3394ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return "Unknown state!"; 3404ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala break; 3414ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 3424ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR 3434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala} 3444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 34561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface 34661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 34761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() { 348a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3499e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 350ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 3513a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 3523a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 353ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mDevice == 0) return; 355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 356ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala stopPreviewLocked(); 3576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 358d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->waitUntilDrained(); 359d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 360d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 3616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mDevice->deleteStream(mPreviewStreamId); 362d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mPreviewStreamId = NO_STREAM; 363d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 364d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 365d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureStreamId != NO_STREAM) { 366d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->deleteStream(mCaptureStreamId); 367d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId = NO_STREAM; 3686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 370898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 371898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala mDevice->deleteStream(mRecordingStreamId); 372898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala mRecordingStreamId = NO_STREAM; 373898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala } 374898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 3753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mDevice.clear(); 3763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mState = DISCONNECTED; 3773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 37861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala CameraService::Client::disconnect(); 37961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 38061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) { 382a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3839e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 384ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 385ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 3869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != 0 && getCallingPid() != mClientPid) { 3879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Connection attempt from pid %d; " 3889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "current locked to pid %d", __FUNCTION__, 3899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraId, getCallingPid(), mClientPid); 3909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return BAD_VALUE; 3919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 3929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 3949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient = client; 3959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 39761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 39861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 39961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() { 400a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4019e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 402ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 4049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 405ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == 0) { 4079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != getCallingPid()) { 4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 41861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 41961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 42061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() { 421a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4229e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 423ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 4259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 426ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Check for uninterruptable conditions 4289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == getCallingPid()) { 4309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = 0; 4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient.clear(); 4329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 43861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 43961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay( 4416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<Surface>& surface) { 442a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4439e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 444ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 4463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 447ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surface != 0) { 4516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surface->asBinder(); 4526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = surface; 4536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 455d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return setPreviewWindowLocked(binder,window); 45661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 45761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture( 4596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<ISurfaceTexture>& surfaceTexture) { 460a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4619e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 462ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 4643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 465ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surfaceTexture != 0) { 4696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surfaceTexture->asBinder(); 4706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = new SurfaceTextureClient(surfaceTexture); 4716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 472d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return setPreviewWindowLocked(binder, window); 4736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 4746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 475d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder, 476be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala sp<ANativeWindow> window) { 477a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 4796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (binder == mPreviewSurface) { 4819e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: New window is same as old window", 4829e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId); 4836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return NO_ERROR; 4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 4873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala case DISCONNECTED: 4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 4899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STILL_CAPTURE: 4909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 4919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 4929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 4939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 4949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 4959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 4969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK 4979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 4989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 4999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Already running preview - need to stop and create a new stream 5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Optimize this so that we don't wait for old stream to drain 5019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // before spinning up new stream 5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mDevice->setStreamingRequest(NULL); 5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = WAITING_FOR_PREVIEW_WINDOW; 5049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 5069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 507d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 508be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->waitUntilDrained(); 509be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 510be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error waiting for preview to drain: %s (%d)", 511be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 512be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 5146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->deleteStream(mPreviewStreamId); 5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 516be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Unable to delete old preview stream: %s (%d)", 517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 5186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 5196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewStreamId = NO_STREAM; 5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 523bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala mPreviewSurface = binder; 524be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewWindow = window; 525bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState == WAITING_FOR_PREVIEW_WINDOW) { 527d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return startPreviewLocked(); 5286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 53161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 53261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 53361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) { 534a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 535ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 5363a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 5373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 53861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 53961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 54061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() { 541a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5429e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 543ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 5443a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 5453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 546d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return startPreviewLocked(); 547d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 548ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 549d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::startPreviewLocked() { 550d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 5516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 5524ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (mState >= PREVIEW) { 5534ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGE("%s: Can't start preview in state %s", 5544ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala __FUNCTION__, getStateName(mState)); 5554ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return INVALID_OPERATION; 5564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 5576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 558be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewWindow == 0) { 5596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = WAITING_FOR_PREVIEW_WINDOW; 5606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 5616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 562be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mState = STOPPED; 5636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 564836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 5659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 566836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updatePreviewStream(k.mParameters); 567be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 568be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 569be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 570be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 5716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 573be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewRequest == NULL) { 574836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updatePreviewRequest(k.mParameters); 575be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 576be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)", 577be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 578be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 579be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 5806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 582be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mPreviewRequest, 583be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 584be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mPreviewStreamId, 1); 5856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 5866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)", 5876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 588be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 589be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 590be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = sort_camera_metadata(mPreviewRequest); 591be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 592be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)", 593be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 5946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 5956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 5986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 599bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview request to start preview: " 600bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala "%s (%d)", 6016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 6036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = PREVIEW; 6056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 60761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 60861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 60961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() { 610a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6119e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 612ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 615ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala stopPreviewLocked(); 616ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala} 617ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 618ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvalavoid Camera2Client::stopPreviewLocked() { 619ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala ATRACE_CALL(); 620d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 6213a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala case DISCONNECTED: 622d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Call before initialized", 623d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 624d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 625d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STOPPED: 626d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 627d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 628d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot stop preview during still capture.", 629d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 630d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 631d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 632d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Handle record stop here 633d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 634d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->setStreamingRequest(NULL); 6352267106c98f461b730c772a913da946c391a178cEino-Ville Talvala mDevice->waitUntilDrained(); 636d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 637d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STOPPED; 638d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 639d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 640d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 641d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState); 642d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 64361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 64461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 64561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() { 646a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 647ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return false; 6503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 6516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return mState == PREVIEW; 65261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 65361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 65461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 655a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 656ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6573a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 6593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 66078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala switch (mState) { 66178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala case RECORD: 66278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala case VIDEO_SNAPSHOT: 66378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Can't be called in state %s", 66478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 66578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 66678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala default: 66778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala // OK 66878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala break; 66978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 670836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 67178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 672836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.storeMetadataInBuffers = enabled; 67378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 67478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return OK; 67561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 67661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 67761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() { 678a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6799e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 680ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 6823a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 6833a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 6849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 6859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 6869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = startPreviewLocked(); 6879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) return res; 6889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 6909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Ready to go 6919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 6939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 6949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to call this when recording is already on 6959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 6969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 6979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 6989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't start recording in state %s", 6999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 7009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 7019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 7029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 703836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 7049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 705836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (!k.mParameters.storeMetadataInBuffers) { 70678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording only supported in metadata mode, but " 70778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "non-metadata recording mode requested!", __FUNCTION__, 70878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mCameraId); 70978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 71078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 71178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 712836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRecordingStream(k.mParameters); 7139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 7159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingRequest == NULL) { 720836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRecordingRequest(k.mParameters); 7219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)", 7239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId }; 7299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mRecordingRequest, 7309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 7319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala outputStreams, 2); 7329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)", 7349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = sort_camera_metadata(mRecordingRequest); 7389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)", 7409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mRecordingRequest); 7459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set recording request to start " 7479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "recording: %s (%d)", __FUNCTION__, mCameraId, 7489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 7499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 7509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = RECORD; 7529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 75461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 75561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 75661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() { 757a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 7589e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 759ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 7613a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 7623a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 7639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala switch (mState) { 7649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 7659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to stop 7669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 7679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 7689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 7699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STILL_CAPTURE: 7709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 7719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 7729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop recording in state %s", 7739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getStateName(mState)); 7749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 7759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 7769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Back to preview. Since record can only be reached through preview, 7789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // all preview stream setup should be up to date. 7799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 7809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 7819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to switch back to preview request: " 7829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 7839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 7849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Should recording heap be freed? Can't do it yet since requests 7879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // could still be in flight. 7889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = PREVIEW; 79061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 79161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 79261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() { 793a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 794ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return false; 7963a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 7979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return (mState == RECORD || mState == VIDEO_SNAPSHOT); 79861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 79961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 80061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 801a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 802ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 8033a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 8043a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 8059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Make sure this is for the current heap 8069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ssize_t offset; 8079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size; 8089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 8099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) { 8109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release " 8119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "(got %x, expected %x)", __FUNCTION__, mCameraId, 8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala heap->getHeapID(), mRecordingHeap->mHeap->getHeapID()); 8139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 8149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 81578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint8_t *data = (uint8_t*)heap->getBase() + offset; 81678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint32_t type = *(uint32_t*)data; 81778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (type != kMetadataBufferTypeGrallocSource) { 81878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)", 81978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource); 82078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return; 82178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 82278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala buffer_handle_t imgBuffer = *(buffer_handle_t*)(data + 4); 82378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId, 824803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala imgBuffer); 82578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala res = mRecordingConsumer->freeBuffer(imgBuffer); 82678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (res != OK) { 82778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):" 82878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "%s (%d)", 82978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala __FUNCTION__, mCameraId, imgBuffer, strerror(-res), res); 83078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return; 83178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 83278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 8339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree++; 83461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 83561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 83661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() { 837a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 838ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 8393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 8403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 8413a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 8426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 84361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 84461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 84561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() { 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 8516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 85261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 85361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 85461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) { 855a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 856ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 8583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 859d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 860d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 8613a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala case DISCONNECTED: 862d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STOPPED: 863d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 864d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 865d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 866d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 867d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 868d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 869d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Good to go for takePicture 870d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 871d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 872d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case VIDEO_SNAPSHOT: 873d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Already taking a picture", 874d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 875d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 876d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 877d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 878836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 879d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 880836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateCaptureStream(k.mParameters); 8814ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 882be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 883be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 8844ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 8854ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 886d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 887d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureRequest == NULL) { 888836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateCaptureRequest(k.mParameters); 8894ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 890be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't create still image capture request: " 891be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 8924ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 8934ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 894d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 895d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 896d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_entry_t outputStreams; 8979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState == PREVIEW) { 8989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId }; 8999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS, 9009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &streamIds, 2); 9019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } else if (mState == RECORD) { 9029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId, 9039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureStreamId }; 9049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS, 9059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &streamIds, 3); 9069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 9079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 908d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 909d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still image capture request: " 910d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 911d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 912d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 913d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 914be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = sort_camera_metadata(mCaptureRequest); 915be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 916be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)", 917be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 918be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 919be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 920d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 921d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest); 922d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (captureCopy == NULL) { 923d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 924d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 925d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return NO_MEMORY; 926d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 927d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 928d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mState == PREVIEW) { 929d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->setStreamingRequest(NULL); 930d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 931d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 932d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 933d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 934d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 935d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 936d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 9379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 938d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->capture(captureCopy); 939d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 940d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 941d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 942d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 943d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 944d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 945d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 946d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 947d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 948d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STILL_CAPTURE; 949d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 950d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 951d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = VIDEO_SNAPSHOT; 952d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 953d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 954d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state for still capture!", 955d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 956d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 957d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 958d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 959d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 96061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 96161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 96261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) { 963a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 9649e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 965ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 9666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala status_t res; 9673a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 9683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 9693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala LockedParameters::Key k(mParameters); 9706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala CameraParameters newParams(params); 9726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only 9746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // parameters such as supported preview sizes, etc. Should probably 9756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // produce an error if they're changed. 9766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala /** Extract and verify new parameters */ 9786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t i; 9806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 9816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_SIZE 9826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int previewWidth, previewHeight; 9836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getPreviewSize(&previewWidth, &previewHeight); 9846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 985836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewWidth != k.mParameters.previewWidth || 986836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala previewHeight != k.mParameters.previewHeight) { 9876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState >= PREVIEW) { 9886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 9899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 9909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, 991836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth, k.mParameters.previewHeight, 9929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala previewWidth, previewHeight); 9936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 9946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 9956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePreviewSizes = 9966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 9976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePreviewSizes.count; i += 2 ) { 9986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availablePreviewSizes.data.i32[i] == previewWidth && 9996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availablePreviewSizes.data.i32[i+1] == previewHeight) break; 10006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePreviewSizes.count) { 10026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 10036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, previewWidth, previewHeight); 10046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FPS_RANGE 100911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int previewFpsRange[2]; 101011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int previewFps = 0; 10116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool fpsRangeChanged = false; 101211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]); 1013836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFpsRange[0] != k.mParameters.previewFpsRange[0] || 1014836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala previewFpsRange[1] != k.mParameters.previewFpsRange[1]) { 10156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala fpsRangeChanged = true; 10166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePreviewFpsRanges = 10176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 10186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 10196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 102011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[0]) && 10216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 102211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1]) ) { 10236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala break; 10246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 10276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 102811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala __FUNCTION__, previewFpsRange[0], previewFpsRange[1]); 10296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 103111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFps = previewFpsRange[0]; 10326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FORMAT 10356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int previewFormat = formatStringToEnum(newParams.getPreviewFormat()); 1036836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFormat != k.mParameters.previewFormat) { 10376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState >= PREVIEW) { 10386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 10396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "is active!", __FUNCTION__); 10406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFormats = 10436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 10446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFormats.count; i++) { 10456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableFormats.data.i32[i] == previewFormat) break; 10466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFormats.count) { 10486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 10496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), previewFormat); 10506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FRAME_RATE 10556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Deprecated, only use if the preview fps range is unchanged this time. 10566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // The single-value FPS is the same as the minimum of the range. 10576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (!fpsRangeChanged) { 10586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala previewFps = newParams.getPreviewFrameRate(); 1059836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFps != k.mParameters.previewFps) { 10606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFrameRates = 10616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 10626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 10636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableFrameRates.data.i32[i] == previewFps) break; 10646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFrameRates.count) { 10666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 10676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, previewFps); 10686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 107011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[0] = availableFrameRates.data.i32[i]; 107111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1] = availableFrameRates.data.i32[i+1]; 10726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PICTURE_SIZE 10766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int pictureWidth, pictureHeight; 10776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getPictureSize(&pictureWidth, &pictureHeight); 1078836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (pictureWidth == k.mParameters.pictureWidth || 1079836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala pictureHeight == k.mParameters.pictureHeight) { 10806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availablePictureSizes = 10816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 10826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePictureSizes.count; i+=2) { 10836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availablePictureSizes.data.i32[i] == pictureWidth && 10846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availablePictureSizes.data.i32[i+1] == pictureHeight) break; 10856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePictureSizes.count) { 10876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 10886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, pictureWidth, pictureHeight); 10896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 10906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 10926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 10936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 109411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int jpegThumbSize[2]; 109511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[0] = 10966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 109711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[1] = 10986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 1099836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (jpegThumbSize[0] != k.mParameters.jpegThumbSize[0] || 1100836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala jpegThumbSize[1] != k.mParameters.jpegThumbSize[1]) { 11016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableJpegThumbSizes = 11026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 11036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 110411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] && 110511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) { 11066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala break; 11076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 11106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 111111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]); 11126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 11176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegThumbQuality = 11186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 11196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegThumbQuality < 0 || jpegThumbQuality > 100) { 11206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 11216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegThumbQuality); 11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_QUALITY 11266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegQuality = 11276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 11286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegQuality < 0 || jpegQuality > 100) { 11296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 11306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegQuality); 11316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ROTATION 11356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegRotation = 11366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 11376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegRotation != 0 && 11386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 90 && 11396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 180 && 11406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 270) { 11416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 11426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegRotation); 11436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // GPS 11476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool gpsEnabled = false; 114811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala double gpsCoordinates[3] = {0,0,0}; 11496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int64_t gpsTimestamp = 0; 11506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala String8 gpsProcessingMethod; 11516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsLatStr = 11526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 11536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (gpsLatStr != NULL) { 11546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsLongStr = 11556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 11566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsAltitudeStr = 11576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 11586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsTimeStr = 11596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 11606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsProcMethodStr = 11616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (gpsLongStr == NULL || 11636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsAltitudeStr == NULL || 11646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsTimeStr == NULL || 11656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsProcMethodStr == NULL) { 11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__); 11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala char *endPtr; 11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 117211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 11746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 11756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 117811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 11796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 11806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 11816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 118411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 11856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 11866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 11876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsAltitudeStr); 11886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 11916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 11926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 11936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsProcessingMethod = gpsProcMethodStr; 11976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsEnabled = true; 11996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // WHITE_BALANCE 12026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int wbMode = wbModeStringToEnum( 12036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 1204836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (wbMode != k.mParameters.wbMode) { 12056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableWbModes = 12066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 12076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 12086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (wbMode == availableWbModes.data.u8[i]) break; 12096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableWbModes.count) { 12116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 12126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 12146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // EFFECT 12196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int effectMode = effectModeStringToEnum( 12206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 1221836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (effectMode != k.mParameters.effectMode) { 12226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableEffectModes = 12236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 12246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 12256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (effectMode == availableEffectModes.data.u8[i]) break; 12266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableEffectModes.count) { 12286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 12296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 12316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ANTIBANDING 12366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int antibandingMode = abModeStringToEnum( 12376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 1238836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (antibandingMode != k.mParameters.antibandingMode) { 12396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableAbModes = 12406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 12416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 12426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (antibandingMode == availableAbModes.data.u8[i]) break; 12436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableAbModes.count) { 12456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 12466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 12486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // SCENE_MODE 12536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int sceneMode = sceneModeStringToEnum( 12546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 1255836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (sceneMode != k.mParameters.sceneMode) { 12566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableSceneModes = 12576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 12586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 12596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (sceneMode == availableSceneModes.data.u8[i]) break; 12606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableSceneModes.count) { 12626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 12636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 12656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FLASH_MODE 12706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::flashMode_t flashMode = flashModeStringToEnum( 12716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 1272836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (flashMode != k.mParameters.flashMode) { 12736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t flashAvailable = 12746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 12756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (!flashAvailable.data.u8[0] && 12766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala flashMode != Parameters::FLASH_MODE_OFF) { 12776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 12786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "No flash on device", __FUNCTION__, 12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 12806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) { 12826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableAeModes = 12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 12846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 12856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (flashMode == availableAeModes.data.u8[i]) break; 12866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableAeModes.count) { 12886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 12896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 12916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (flashMode == -1) { 12946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 12956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 12966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 12976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FOCUS_MODE 13026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::focusMode_t focusMode = focusModeStringToEnum( 13036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 1304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (focusMode != k.mParameters.focusMode) { 13056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode != Parameters::FOCUS_MODE_FIXED) { 13066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t minFocusDistance = 13076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE); 13086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 13096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 13106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "fixed focus lens", 13116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 13126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 13136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) { 13156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableFocusModes = 13166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 13176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 13186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode == availableFocusModes.data.u8[i]) break; 13196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFocusModes.count) { 13216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 13226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 13236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 13246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FOCUS_AREAS 13316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> focusingAreas; 13326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 13336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala &focusingAreas); 13346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t max3aRegions = 13356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 13366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 13376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res != OK) { 13386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 13396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 13406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // EXPOSURE_COMPENSATION 13446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int exposureCompensation = 13456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 13466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t exposureCompensationRange = 13476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE); 13486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (exposureCompensation < exposureCompensationRange.data.i32[0] || 13496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala exposureCompensation > exposureCompensationRange.data.i32[1]) { 13506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 13516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, exposureCompensation); 13526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // AUTO_EXPOSURE_LOCK (always supported) 13566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool autoExposureLock = boolFromString( 13576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 13586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // AUTO_WHITEBALANCE_LOCK (always supported) 13606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool autoWhiteBalanceLock = boolFromString( 13616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 13626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // METERING_AREAS 13646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> meteringAreas; 13656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 13666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala &meteringAreas); 13676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 13686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res != OK) { 13696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 13706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 13716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 13726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ZOOM 13766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 13776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) { 13786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested zoom level %d is not supported", 13796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, zoom); 13806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // VIDEO_SIZE 13846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int videoWidth, videoHeight; 13856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getVideoSize(&videoWidth, &videoHeight); 1386836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (videoWidth != k.mParameters.videoWidth || 1387836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala videoHeight != k.mParameters.videoHeight) { 13886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (mState == RECORD) { 13896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Video size cannot be updated when recording is active!", 13906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__); 13916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableVideoSizes = 13946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 13956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableVideoSizes.count; i += 2 ) { 13966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableVideoSizes.data.i32[i] == videoWidth && 13976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availableVideoSizes.data.i32[i+1] == videoHeight) break; 13986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableVideoSizes.count) { 14006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested video size %d x %d is not supported", 14016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, videoWidth, videoHeight); 14026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // RECORDING_HINT (always supported) 14076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool recordingHint = boolFromString( 14086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 14096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // VIDEO_STABILIZATION 14116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool videoStabilization = boolFromString( 14126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 14136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala camera_metadata_entry_t availableVideoStabilizationModes = 14146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 14156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (videoStabilization && availableVideoStabilizationModes.count == 1) { 14166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 14176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala /** Update internal parameters */ 14209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1421836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth = previewWidth; 1422836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewHeight = previewHeight; 1423836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0] = previewFpsRange[0]; 1424836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1] = previewFpsRange[1]; 1425836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFps = previewFps; 1426836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFormat = previewFormat; 1427836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1428836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureWidth = pictureWidth; 1429836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight = pictureHeight; 1430836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1431836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0] = jpegThumbSize[0]; 1432836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1] = jpegThumbSize[1]; 1433836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality = jpegQuality; 1434836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality = jpegThumbQuality; 1435836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1436836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsEnabled = gpsEnabled; 1437836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[0] = gpsCoordinates[0]; 1438836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[1] = gpsCoordinates[1]; 1439836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[2] = gpsCoordinates[2]; 1440836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsTimestamp = gpsTimestamp; 1441836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsProcessingMethod = gpsProcessingMethod; 1442836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1443836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.wbMode = wbMode; 1444836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.effectMode = effectMode; 1445836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.antibandingMode = antibandingMode; 1446836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.sceneMode = sceneMode; 1447836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1448836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = flashMode; 1449836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = focusMode; 1450836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1451836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas = focusingAreas; 1452836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation = exposureCompensation; 1453836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoExposureLock = autoExposureLock; 1454836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock; 1455836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.meteringAreas = meteringAreas; 1456836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.zoom = zoom; 1457836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1458836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoWidth = videoWidth; 1459836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoHeight = videoHeight; 1460836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1461836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.recordingHint = recordingHint; 1462836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoStabilization = videoStabilization; 1463836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1464836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updatePreviewRequest(k.mParameters); 1465be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1466be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 1467be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1468be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1469be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 1470836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateCaptureRequest(k.mParameters); 1471be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1472be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)", 1473be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1474be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1475be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 1476be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 1477836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRecordingRequest(k.mParameters); 14789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 14799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 14809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 14819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 14829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 14839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1484be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mState == PREVIEW) { 1485be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 1486be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1487be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 1488be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1489be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1490be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 14919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } else if (mState == RECORD || mState == VIDEO_SNAPSHOT) { 14929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mRecordingRequest); 14939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 14949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 14959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 14969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 14979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 1498be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 14996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 1500836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.paramsFlattened = params; 15019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 150361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 1504f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 150561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const { 1506a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1507ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 15083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return String8(); 1509ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 1510836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::ReadKey k(mParameters); 1511ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 15123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala // TODO: Deal with focus distances 1513836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala return k.mParameters.paramsFlattened; 151461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 151561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 151661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1517a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1518ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 15193a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 15203a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1521c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1522c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1523c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala cmd, arg1, arg2); 1524c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1525c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (cmd == CAMERA_CMD_SET_DISPLAY_ORIENTATION) { 1526836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 1527c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala int transform = degToTransform(arg1, 1528c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 1529c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (transform == -1) { 1530c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as display orientation value", 1531c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala __FUNCTION__, mCameraId, arg1); 1532c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 1533c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1534836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (transform != k.mParameters.previewTransform && 1535c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mPreviewStreamId != NO_STREAM) { 1536c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mDevice->setStreamTransform(mPreviewStreamId, transform); 1537c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1538836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewTransform = transform; 1539c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return OK; 15403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala } else if (cmd == CAMERA_CMD_PING) { 15413a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala // Always ping back if access is proper and device is alive 15423a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if (mState != DISCONNECTED) { 15433a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala return OK; 15443a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala } else { 15453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala return NO_INIT; 15463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala } 1547c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1548c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1549c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unimplemented command %d (%d, %d)", __FUNCTION__, 1550c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraId, cmd, arg1, arg2); 1551c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 15526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 155361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 155461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 15553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */ 15563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1557d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() { 1558d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 1559d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 1560d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala sp<ICameraClient> currentClient; 15619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId); 15629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1563d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala CpuConsumer::LockedBuffer imgBuffer; 1564d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala { 1565d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 1566d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1567d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Signal errors here upstream 1568d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) { 1569d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly!", 1570d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 1571d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1572d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1573d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1574d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mCaptureConsumer->lockNextBuffer(&imgBuffer); 1575d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1576d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)", 1577d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1578d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1579d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1580d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1581d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) { 1582d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected format for still image: " 1583d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%x, expected %x", __FUNCTION__, mCameraId, 1584d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala imgBuffer.format, 1585d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala HAL_PIXEL_FORMAT_BLOB); 1586d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 1587d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 1588d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1589d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1590d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Optimize this to avoid memcopy 15919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala void* captureMemory = mCaptureHeap->mHeap->getBase(); 15929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size = mCaptureHeap->mHeap->getSize(); 1593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala memcpy(captureMemory, imgBuffer.data, size); 1594d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1595d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 1596d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1597d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala currentClient = mCameraClient; 1598d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala switch (mState) { 1599d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 1600d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = STOPPED; 1601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1602d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case VIDEO_SNAPSHOT: 1603d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mState = RECORD; 1604d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1605d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 1606d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__, 1607d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCameraId, mState); 1608d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1609d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1610d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1611d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Call outside mICameraLock to allow re-entrancy from notification 1612d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (currentClient != 0) { 1613d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 16149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureHeap->mBuffers[0], NULL); 16159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 16179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 16189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() { 16199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ATRACE_CALL(); 16209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 16219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<ICameraClient> currentClient; 16229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t heapIdx = 0; 16239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala nsecs_t timestamp; 16249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala { 16259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala Mutex::Autolock icl(mICameraLock); 16269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Signal errors here upstream 1627898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala bool discardData = false; 16289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RECORD && mState != VIDEO_SNAPSHOT) { 1629898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala ALOGV("%s: Camera %d: Discarding recording image buffers received after " 1630898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala "recording done", 16319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 1632898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala discardData = true; 16339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 163578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala buffer_handle_t imgBuffer; 163678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala res = mRecordingConsumer->getNextBuffer(&imgBuffer, ×tamp); 16379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 16389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)", 16399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 16409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 16419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1643898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala if (discardData) { 164478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mRecordingConsumer->freeBuffer(imgBuffer); 16459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 16469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 1647898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 164878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (mRecordingHeap == 0) { 164978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala const size_t bufferSize = 4 + sizeof(buffer_handle_t); 16509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Creating recording heap with %d buffers of " 16519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "size %d bytes", __FUNCTION__, mCameraId, 16529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala kRecordingHeapCount, bufferSize); 16539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingHeap != 0) { 16549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Previous heap has size %d " 16559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "(new will be %d) bytes", __FUNCTION__, mCameraId, 16569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mHeap->getSize(), 16579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala bufferSize * kRecordingHeapCount); 16589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Need to allocate memory for heap 16609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap.clear(); 16619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 16629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap = new Camera2Heap(bufferSize, kRecordingHeapCount, 16639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "Camera2Client::RecordingHeap"); 16649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingHeap->mHeap->getSize() == 0) { 16659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for recording", 16669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 166778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mRecordingConsumer->freeBuffer(imgBuffer); 16689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 16699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapHead = 0; 16719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree = kRecordingHeapCount; 16729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 16749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if ( mRecordingHeapFree == 0) { 16759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: No free recording buffers, dropping frame", 16769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 167778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mRecordingConsumer->freeBuffer(imgBuffer); 16789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 16799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 16809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala heapIdx = mRecordingHeapHead; 16819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapHead = (mRecordingHeapHead + 1) % kRecordingHeapCount; 16829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree--; 16839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 16849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Timestamp %lld", 16859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, timestamp); 16869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 16879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ssize_t offset; 16889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size; 16899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<IMemoryHeap> heap = 16909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset, 16919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &size); 16929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 169378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint8_t *data = (uint8_t*)heap->getBase() + offset; 169478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint32_t type = kMetadataBufferTypeGrallocSource; 169578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala memcpy(data, &type, 4); 169678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala memcpy(data + 4, &imgBuffer, sizeof(buffer_handle_t)); 169778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGV("%s: Camera %d: Sending out buffer_handle_t %p", 1698803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala __FUNCTION__, mCameraId, imgBuffer); 16999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala currentClient = mCameraClient; 17009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 17019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Call outside mICameraLock to allow re-entrancy from notification 17029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (currentClient != 0) { 17039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala currentClient->dataCallbackTimestamp(timestamp, 17049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala CAMERA_MSG_VIDEO_FRAME, 17059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mBuffers[heapIdx]); 1706d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1707d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 1708d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 17093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag, 17103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala size_t minCount, size_t maxCount) { 17113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala status_t res; 17123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t entry; 17133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala res = find_camera_metadata_entry(mDevice->info(), 17143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tag, 17153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala &entry); 17163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 17173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 17183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 17193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 17203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 17213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 17223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)", 17233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tagSection, tagName, tag, strerror(-res), res); 17243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.count = 0; 17253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.data.u8 = NULL; 17263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } else if (CC_UNLIKELY( 17273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 17283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 17293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 17303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 17313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 17323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 17333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 17343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "Expected between %d and %d values, but got %d values", 17353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 17363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.count = 0; 17373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala entry.data.u8 = NULL; 17383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } 17393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 17403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return entry; 17413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala} 17423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 17433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */ 17443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1745f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() { 1747a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1748836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 1749ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 1750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 17513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters params; 1752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 17533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableProcessedSizes = 17543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2); 17553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableProcessedSizes.count) return NO_INIT; 1756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick more intelligently 1758836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth = availableProcessedSizes.data.i32[0]; 1759836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewHeight = availableProcessedSizes.data.i32[1]; 1760836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoWidth = k.mParameters.previewWidth; 1761836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoHeight = k.mParameters.previewHeight; 17623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1763836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setPreviewSize(k.mParameters.previewWidth, k.mParameters.previewHeight); 1764836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setVideoSize(k.mParameters.videoWidth, k.mParameters.videoHeight); 17653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 17663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8::format("%dx%d", 1767836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth, k.mParameters.previewHeight)); 1768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1769f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewSizes; 1770f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableProcessedSizes.count; i += 2) { 1771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewSizes += ","; 1772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes += String8::format("%dx%d", 1773f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableProcessedSizes.data.i32[i], 1774f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableProcessedSizes.data.i32[i+1]); 1775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 17763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 1777f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes); 17783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 1779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes); 1780f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1781f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 17823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFpsRanges = 17833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 17843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableFpsRanges.count) return NO_INIT; 1785f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1786836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0]; 1787836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1]; 1788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 17893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 17903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8::format("%d,%d", 1791836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0], 1792836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1])); 1793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1795f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFpsRange; 1796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewFpsRange += ","; 1798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFpsRange += String8::format("(%d,%d)", 1799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i], 1800f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i+1]); 1801f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 18023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 1803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFpsRange); 1804f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1805f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1806836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 18073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FORMAT, 1808836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala formatEnumToString(k.mParameters.previewFormat)); // NV21 18093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1810836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewTransform = degToTransform(0, 1811c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 1812c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 18133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFormats = 18143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 1815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFormats; 1818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 1819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFormats.count; i++) { 1820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedPreviewFormats += ","; 1821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 1822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableFormats.data.i32[i]) { 1823f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1824bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1825bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422SP; 1826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1828bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1829bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 1830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1831f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: 1832bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1833bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422I; 1834f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1835f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: 1836bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1837bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 1838f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1839f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 1840bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 1841bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGB565; 1842f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 184311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 184411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala supportedPreviewFormats += 184511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGBA8888; 184611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala break; 184711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 1848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 184911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 1850f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1851f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 185211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala 1853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 1854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown preview format: %x", 1855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableFormats.data.i32[i]); 1856f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 18603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 1861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFormats); 1862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 1865f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // still have to do something sane for them 1866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 18673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 1868836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0]); 1869f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1870f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFrameRates; 1872f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1873f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewFrameRates += ","; 1874f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 1875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i]); 1876f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 18773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 1878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFrameRates); 1879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 18813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableJpegSizes = 18823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 18833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableJpegSizes.count) return NO_INIT; 1884f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1885f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick maximum 1886836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureWidth = availableJpegSizes.data.i32[0]; 1887836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight = availableJpegSizes.data.i32[1]; 1888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1889836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setPictureSize(k.mParameters.pictureWidth, 1890836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight); 1891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPictureSizes; 1894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableJpegSizes.count; i += 2) { 1895f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 1896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 1897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegSizes.data.i32[i], 1898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegSizes.data.i32[i+1]); 1899f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 19003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 1901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPictureSizes); 1902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1903f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 19043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 19053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 19063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 1907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 19083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableJpegThumbnailSizes = 19093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2); 19103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 1911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick default thumbnail size sensibly 1913836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0]; 1914836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1]; 1915f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 19163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 1917836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0]); 19183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 1919836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1]); 1920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedJpegThumbSizes; 1923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 1924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 1925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 1926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 1927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 1928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 19293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 1930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedJpegThumbSizes); 1931f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1933836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality = 90; 19343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 1935836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality); 1936836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality = 90; 19373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 1938836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality); 1939836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegRotation = 0; 19403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 1941836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegRotation); 19423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1943836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsEnabled = false; 1944836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsProcessingMethod = "unknown"; 19453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 19463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1947836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO; 19483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 19493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 19503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 19513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableWhiteBalanceModes = 19523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 1953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 1954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedWhiteBalance; 1955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 1956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 1957f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 1958f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 1959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 1960f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_AUTO: 1961bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1962bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 1963f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1964f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_INCANDESCENT: 1965bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1966bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 1967f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1968f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_FLUORESCENT: 1969bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1970bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 1971f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1972f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 1973bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1974bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 1975f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1976f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_DAYLIGHT: 1977bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1978bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 1979f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1980f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 1981bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1982bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 1983f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1984f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_TWILIGHT: 1985bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1986bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 1987f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1988f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_SHADE: 1989bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 1990bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 1991f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1992f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Skipping values not mappable to v1 API 1993f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_OFF: 1994f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 1995f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 1996f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 1997f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 1998f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, 1999f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 2000f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2001f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2002f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2003f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 20043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 2005f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedWhiteBalance); 2006f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2007f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2008836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF; 20093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 20103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::EFFECT_NONE); 20113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 20123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableEffects = 20133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 20143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableEffects.count) return NO_INIT; 2015f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2016f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedEffects; 2017f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2018f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 2019f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedEffects += ","; 2020f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2021f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 2022f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_OFF: 2023bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2024bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_NONE; 2025f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2026f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_MONO: 2027bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2028bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_MONO; 2029bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala break; 2030f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_NEGATIVE: 2031bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2032bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 2033f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2034f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SOLARIZE: 2035bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2036bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 2037f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2038f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SEPIA: 2039bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2040bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_SEPIA; 2041f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2042f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_POSTERIZE: 2043bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2044bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 2045f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2046f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_WHITEBOARD: 2047bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2048bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 2049f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2050f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_BLACKBOARD: 2051bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2052bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 2053f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2054f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_AQUA: 2055bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2056bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_AQUA; 2057f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2058f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2059f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 2060f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableEffects.data.u8[i]); 2061f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2062f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2063f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2064f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 20653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 2066f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2067f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2068836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 20693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 20703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 20713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 20723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAntibandingModes = 20733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 20743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAntibandingModes.count) return NO_INIT; 2075f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2076f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedAntibanding; 2077f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2078f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 2079f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 2080f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2081f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 2082f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_OFF: 2083bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2084bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 2085f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2086f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_50HZ: 2087bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2088bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 2089f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2090f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_60HZ: 2091bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2092bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 2093f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2094f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_AUTO: 2095bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2096bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 2097f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2098f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2099f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 2100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, 2101f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 2102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 21063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 2107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedAntibanding); 2108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2110836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.sceneMode = ANDROID_CONTROL_OFF; 21113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 21123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 21133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 21143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableSceneModes = 21153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 21163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableSceneModes.count) return NO_INIT; 2117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2118bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 2119f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = true; 2120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool noSceneModes = false; 2121f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 2122f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 2123f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 2125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala noSceneModes = true; 2127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 2129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Not in old API 2130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2131f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2132f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 2133bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2134bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 2135f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 2137bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2138bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 2139f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 2141bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2142bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 2143f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 2145bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2146bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 2147f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2148f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 2149bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2150bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 2151f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 2153bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2154bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 2155f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2156f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 2157bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2158bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 2159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2160f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 2161bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2162bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 2163f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2164f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 2165bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2166bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 2167f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2168f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 2169bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2170bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 2171f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2172f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 2173bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2174bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 2175f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2176f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 2177bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2178bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 2179f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 2181bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2182bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 2183f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2184f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 2185bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2186bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 2187f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2188f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 2189bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2190bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 2191f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2192f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2193f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 2194bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala __FUNCTION__, mCameraId, 2195bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala availableSceneModes.data.u8[i]); 2196f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2197f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2198f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2199f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2200f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (!noSceneModes) { 22013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 2202f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedSceneModes); 2203f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2204f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2205f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t flashAvailable = 22073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 22083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!flashAvailable.count) return NO_INIT; 2209f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAeModes = 22113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 22123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAeModes.count) return NO_INIT; 2213f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2214f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (flashAvailable.data.u8[0]) { 2215836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = Parameters::FLASH_MODE_AUTO; 22163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 22173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_AUTO); 22183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 22193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 22203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 22213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 22223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 22233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 2224f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 2225f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (availableAeModes.data.u8[i] == 2226f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) { 22273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 22283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 2229f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 22323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 2233f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedFlashModes); 22343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } else { 2235836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = Parameters::FLASH_MODE_OFF; 22363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 22373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 22383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 22393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 2240f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2241f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 22423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t minFocusDistance = 22433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1); 22443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!minFocusDistance.count) return NO_INIT; 22453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 22463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableAfModes = 22473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 22483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAfModes.count) return NO_INIT; 22493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2250f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 2251f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Fixed-focus lens 2252836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = Parameters::FOCUS_MODE_FIXED; 22533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 22543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 22553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 22563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 2257f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 2258836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 22593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 22603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 22613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED); 22623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFocusModes = supportedFocusModes + "," + 22633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_INFINITY; 2264f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = true; 2265bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 2266f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 2267f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 2268f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2269f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 2270f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_AUTO: 2271bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2272bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 2273f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2274f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_MACRO: 2275bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2276bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 2277f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2278f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 2279bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2280bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 2281f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2282f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 2283bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2284bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 2285f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2286f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_EDOF: 2287bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 2288bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 2289f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2290bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala // Not supported in old API 2291f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_OFF: 2292f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2293f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2294f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2295f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 2296f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableAfModes.data.u8[i]); 2297f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2298f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2299f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2300f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 23013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 2302f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedFocusModes); 2303f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2304f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t max3aRegions = 23063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 23073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!max3aRegions.count) return NO_INIT; 2308f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 2310f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala max3aRegions.data.i32[0]); 23113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 2312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "(0,0,0,0,0)"); 2313836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas.clear(); 2314836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0)); 23153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 23163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableFocalLengths = 23173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS); 23183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 2319f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2320f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float minFocalLength = availableFocalLengths.data.f[0]; 23213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 2322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t sensorSize = 23243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2); 23253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!sensorSize.count) return NO_INIT; 2326f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2327f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // The fields of view here assume infinity focus, maximum wide angle 2328f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float horizFov = 180 / M_PI * 2329f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength)); 2330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float vertFov = 180 / M_PI * 2331f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength)); 23323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 23333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 2334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2335836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation = 0; 23363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 2337836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation); 2338f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t exposureCompensationRange = 23403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2); 23413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 23423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 23433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 2344f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 23453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 2346f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 2347f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t exposureCompensationStep = 23493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1); 23503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 23513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 23523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 2353f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationStep.data.r[0].numerator / 2354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 2355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2356836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoExposureLock = false; 23573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 23583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 23593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 23603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2362836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoWhiteBalanceLock = false; 23633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 23643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 23653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 23663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2367f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2368836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 23693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 2370f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala max3aRegions.data.i32[0]); 23713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 2372f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "(0,0,0,0,0)"); 2373f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2374836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.zoom = 0; 2375836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.set(CameraParameters::KEY_ZOOM, k.mParameters.zoom); 23763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 2377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t maxDigitalZoom = 23793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1); 23803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 2381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 zoomRatios; 2384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float zoom = 1.f; 2385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 23866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala (NUM_ZOOM_STEPS-1); 2387f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 23886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 2389f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) zoomRatios += ","; 2390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 2392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala zoom += zoomIncrement; 2393f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 23943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 2395f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2396f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 23973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 23983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 23993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 24003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2401f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 24023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 2403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "Infinity,Infinity,Infinity"); 2404f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 24053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t maxFacesDetected = 24063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1); 24073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 2408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala maxFacesDetected.data.i32[0]); 24093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 2410f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 0); 2411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 24123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 241378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 2414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 24153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 24163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 2417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 24183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 24193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2420f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 24213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 24223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 24233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 24243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala camera_metadata_entry_t availableVideoStabilizationModes = 24253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 24263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableVideoStabilizationModes.count) return NO_INIT; 2427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2428f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 24293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 24303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 2431f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 24323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 24333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 2434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 243678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala // Always use metadata mode for recording 2437836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.storeMetadataInBuffers = true; 243878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 2439836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.paramsFlattened = params.flatten(); 24403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2441f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 2442f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 244361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 2444836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters ¶ms) { 2445be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2446be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2447836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 2448be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 2449be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Check if stream parameters have to change 2450be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint32_t currentWidth, currentHeight; 2451be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->getStreamInfo(mPreviewStreamId, 2452be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ¤tWidth, ¤tHeight, 0); 2453be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2454be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error querying preview stream info: " 2455be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2456be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2457be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2458836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.previewWidth || 2459836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.previewHeight) { 24609e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d", 24619e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId, currentWidth, currentHeight, 2462836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth, params.previewHeight); 2463be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->waitUntilDrained(); 2464be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2465be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error waiting for preview to drain: " 2466be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2467be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2468be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2469be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->deleteStream(mPreviewStreamId); 2470be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2471be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 2472be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "for preview: %s (%d)", __FUNCTION__, mCameraId, 2473be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2474be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2475be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2476be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewStreamId = NO_STREAM; 2477be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2478be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2479be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2480be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewStreamId == NO_STREAM) { 2481be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->createStream(mPreviewWindow, 2482836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth, params.previewHeight, 2483be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, 2484be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mPreviewStreamId); 2485be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2486be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)", 2487be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 2488be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2489be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2490be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2491be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2492c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = mDevice->setStreamTransform(mPreviewStreamId, 2493836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewTransform); 2494c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (res != OK) { 2495c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview stream transform: " 2496c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2497c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return res; 2498c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 2499c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 2500be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 2501be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2502be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2503836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters ¶ms) { 2504a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 25056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 25066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mPreviewRequest == NULL) { 25076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 25086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &mPreviewRequest); 25096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 25106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default preview request: " 25116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 25126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 25136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 25146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2516836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRequestCommon(mPreviewRequest, params); 2517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of preview " 2519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 2520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2521be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2523be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 25246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 25256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 25266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 2527836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureStream(const Parameters ¶ms) { 2528be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2529d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 2530d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Find out buffer size for JPEG 2531d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala camera_metadata_entry_t maxJpegSize = 2532d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala staticInfo(ANDROID_JPEG_MAX_SIZE); 2533d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (maxJpegSize.count == 0) { 2534d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!", 2535d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 2536d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 2537d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2538d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2539d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureConsumer == 0) { 2540d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Create CPU buffer queue endpoint 2541d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer = new CpuConsumer(1); 2542d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this)); 2543d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer")); 2544d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureWindow = new SurfaceTextureClient( 2545d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->getProducerInterface()); 2546d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Create memory for API consumption 25479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1, 25489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "Camera2Client::CaptureHeap"); 25499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mCaptureHeap->mHeap->getSize() == 0) { 2550d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for capture", 2551d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 2552d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return NO_MEMORY; 2553d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2554d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2555d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2556be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mCaptureStreamId != NO_STREAM) { 2557d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Check if stream parameters have to change 2558d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t currentWidth, currentHeight; 2559d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->getStreamInfo(mCaptureStreamId, 2560d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ¤tWidth, ¤tHeight, 0); 2561d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2562d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying capture output stream info: " 2563d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2564d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2565d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2566836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.pictureWidth || 2567836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.pictureHeight) { 2568d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->deleteStream(mCaptureStreamId); 2569d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2570d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 2571d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "for capture: %s (%d)", __FUNCTION__, mCameraId, 2572d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala strerror(-res), res); 2573d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2574d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2575d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId = NO_STREAM; 2576d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2577d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2578be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2579be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mCaptureStreamId == NO_STREAM) { 2580be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Create stream for HAL production 2581be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->createStream(mCaptureWindow, 2582836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.pictureWidth, params.pictureHeight, 2583be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0], 2584be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mCaptureStreamId); 2585be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2586be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for capture: " 2587be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2588be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2589be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2590be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2591be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2592d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 2593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 2594be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2595836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest(const Parameters ¶ms) { 2596d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 2597d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 2598d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureRequest == NULL) { 2599d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE, 2600d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala &mCaptureRequest); 2601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2602d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 2603d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2604d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 2605d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2606d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2607be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2608836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRequestCommon(mCaptureRequest, params); 2609be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2610be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 2611be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 2612be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 2613be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2614be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2615be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2616be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2617be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_THUMBNAIL_SIZE, 2618836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.jpegThumbSize, 2); 2619be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2620be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2621be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_THUMBNAIL_QUALITY, 2622836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegThumbQuality, 1); 2623be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2624be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2625be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_QUALITY, 2626836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegQuality, 1); 2627be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2628be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_ORIENTATION, 2630836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegRotation, 1); 2631be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2632be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2633836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.gpsEnabled) { 2634be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2635be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 2636836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.gpsCoordinates, 3); 2637be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2638be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2639be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 2640836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.gpsTimestamp, 1); 2641be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2642be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(mCaptureRequest, 2643be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 2644836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.gpsProcessingMethod.string(), 2645836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.gpsProcessingMethod.size()); 2646be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2647be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else { 2648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES); 2650be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2651be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2652be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP); 2653be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2654be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = deleteEntry(mCaptureRequest, 2655be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD); 2656be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2657be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2658be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2659d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 2660d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 2661d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2662836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters ¶ms) { 26639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ATRACE_CALL(); 26649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 26659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingRequest == NULL) { 26669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD, 26679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &mRecordingRequest); 26689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 26699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default recording request:" 26709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 26719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 26729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2675836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala res = updateRequestCommon(mRecordingRequest, params); 26769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 26779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of recording " 26789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 26799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 26809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 26819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 26839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 26849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 26859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2686836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters ¶ms) { 26879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 26889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 26899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingConsumer == 0) { 26909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Create CPU buffer queue endpoint 2691803cbf6190f16f7b2c43cbc51d0df21ec888abddEino-Ville Talvala mRecordingConsumer = new MediaConsumer(kRecordingHeapCount); 26929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this)); 26939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer")); 26949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingWindow = new SurfaceTextureClient( 26959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->getProducerInterface()); 26969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Allocate memory later, since we don't know buffer size until receipt 26979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 26989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 26999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 27009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Check if stream parameters have to change 27019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint32_t currentWidth, currentHeight; 27029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->getStreamInfo(mRecordingStreamId, 27039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ¤tWidth, ¤tHeight, 0); 27049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 27059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error querying recording output stream info: " 27069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 27079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 27089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 2709836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.videoWidth || 2710836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.videoHeight) { 27119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Should wait to be sure previous recording has finished 27129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->deleteStream(mRecordingStreamId); 27139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 27149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 27159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "for recording: %s (%d)", __FUNCTION__, mCameraId, 27169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 27179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 27189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 27199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingStreamId = NO_STREAM; 27209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 27219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 27229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 27239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingStreamId == NO_STREAM) { 27249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->createStream(mRecordingWindow, 2725836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.videoWidth, params.videoHeight, 272678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId); 27279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 27289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for recording: " 27299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 27309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 27319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 27329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 27339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 27349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 27359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 27369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2737836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(camera_metadata_t *request, 2738836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const Parameters ¶ms) { 2739be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 2740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2742836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ANDROID_CONTROL_AE_TARGET_FPS_RANGE, params.previewFpsRange, 2); 2743be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2744be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2745836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint8_t wbMode = params.autoWhiteBalanceLock ? 2746836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ANDROID_CONTROL_AWB_LOCKED : params.wbMode; 2747be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2748be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AWB_MODE, &wbMode, 1); 2749be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2750be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2751836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ANDROID_CONTROL_EFFECT_MODE, ¶ms.effectMode, 1); 2752be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2753be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2754be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_MODE, 2755836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.antibandingMode, 1); 2756be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2757be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2758be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t controlMode = 2759836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ? 2760be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE; 2761be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2762be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_MODE, &controlMode, 1); 2763be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2764be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) { 2765be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2766be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_SCENE_MODE, 2767836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.sceneMode, 1); 2768be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2769be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2770be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2771be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t flashMode = ANDROID_FLASH_OFF; 2772be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t aeMode; 2773836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (params.flashMode) { 2774be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_OFF: 2775be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON; break; 2776be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 2777be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break; 2778be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_ON: 2779be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break; 2780be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 2781be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON; 2782be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala flashMode = ANDROID_FLASH_TORCH; 2783be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 2784be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 2785be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break; 2786be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala default: 2787be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 2788836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala mCameraId, params.flashMode); 2789be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return BAD_VALUE; 2790be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2791836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED; 2792be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2793be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2794be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_FLASH_MODE, &flashMode, 1); 2795be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2796be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2797be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_MODE, &aeMode, 1); 2798be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2799be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2800be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float focusDistance = 0; // infinity focus in diopters 2801be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t focusMode; 2802836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (params.focusMode) { 2803be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 2804be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 2805be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 2806be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 2807be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 2808836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusMode = params.focusMode; 2809be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 2810be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 2811be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 2812be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusMode = ANDROID_CONTROL_AF_OFF; 2813be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 2814be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala default: 2815be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 2816836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala mCameraId, params.focusMode); 2817be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return BAD_VALUE; 2818be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2819be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2820be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); 2821be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2822be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2823be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AF_MODE, &focusMode, 1); 2824be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2825be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2826836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala size_t focusingAreasSize = params.focusingAreas.size() * 5; 2827be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t *focusingAreas = new int32_t[focusingAreasSize]; 2828be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala for (size_t i = 0; i < focusingAreasSize; i += 5) { 2829836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 0] = params.focusingAreas[i].left; 2830836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 1] = params.focusingAreas[i].top; 2831836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 2] = params.focusingAreas[i].right; 2832836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 3] = params.focusingAreas[i].bottom; 2833836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 4] = params.focusingAreas[i].weight; 2834be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2835be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2836be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AF_REGIONS, focusingAreas,focusingAreasSize); 2837be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2838be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala delete[] focusingAreas; 2839be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2840be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2841be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_EXP_COMPENSATION, 2842836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.exposureCompensation, 1); 2843be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2844be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2845836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala size_t meteringAreasSize = params.meteringAreas.size() * 5; 2846be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t *meteringAreas = new int32_t[meteringAreasSize]; 2847be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala for (size_t i = 0; i < meteringAreasSize; i += 5) { 2848836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 0] = params.meteringAreas[i].left; 2849836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 1] = params.meteringAreas[i].top; 2850836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 2] = params.meteringAreas[i].right; 2851836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 3] = params.meteringAreas[i].bottom; 2852836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 4] = params.meteringAreas[i].weight; 2853be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2854be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2855be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AE_REGIONS, meteringAreas, meteringAreasSize); 2856be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2857be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2858be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2859be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AWB_REGIONS, meteringAreas, meteringAreasSize); 2860be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2861be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala delete[] meteringAreas; 2862be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2863be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Need to convert zoom index into a crop rectangle. The rectangle is 2864be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // chosen to maximize its area on the sensor 2865be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2866be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t maxDigitalZoom = 2867be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM); 2868be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 2869be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala (NUM_ZOOM_STEPS-1); 2870836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala float zoomRatio = 1 + zoomIncrement * params.zoom; 2871be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2872be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t activePixelArraySize = 2873be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2); 2874be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t arrayWidth = activePixelArraySize.data.i32[0]; 2875be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t arrayHeight = activePixelArraySize.data.i32[1]; 2876be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomLeft, zoomTop, zoomWidth, zoomHeight; 2877836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.previewWidth >= params.previewHeight) { 2878be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomWidth = arrayWidth / zoomRatio; 2879be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomHeight = zoomWidth * 2880836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewHeight / params.previewWidth; 2881be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else { 2882be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomHeight = arrayHeight / zoomRatio; 2883be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomWidth = zoomHeight * 2884836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth / params.previewHeight; 2885be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2886be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomLeft = (arrayWidth - zoomWidth) / 2; 2887be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomTop = (arrayHeight - zoomHeight) / 2; 2888be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2889be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth }; 2890be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2891be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_SCALER_CROP_REGION, cropRegion, 3); 2892be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2893be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2894be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // TODO: Decide how to map recordingHint, or whether just to ignore it 2895be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2896836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint8_t vstabMode = params.videoStabilization ? 2897be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_ON : 2898be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; 2899be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = updateEntry(request, 2900be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 2901be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &vstabMode, 1); 2902be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 2903be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2904be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 2905be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2906be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2907be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateEntry(camera_metadata_t *buffer, 2908be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint32_t tag, const void *data, size_t data_count) { 2909be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t entry; 2910be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2911be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = find_camera_metadata_entry(buffer, tag, &entry); 2912be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res == NAME_NOT_FOUND) { 2913be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = add_camera_metadata_entry(buffer, 2914be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala tag, data, data_count); 2915be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else if (res == OK) { 2916be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = update_camera_metadata_entry(buffer, 2917be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala entry.index, data, data_count, NULL); 2918be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2919be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2920be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2921be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", 2922be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, get_camera_metadata_section_name(tag), 2923be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2924be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2925be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2926be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2927be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 2928be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::deleteEntry(camera_metadata_t *buffer, uint32_t tag) { 2929be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala camera_metadata_entry_t entry; 2930be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 2931be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = find_camera_metadata_entry(buffer, tag, &entry); 2932be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res == NAME_NOT_FOUND) { 2933be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 2934be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else if (res != OK) { 2935be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error looking for entry %s.%s (%x): %s %d", 2936be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, 2937be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_section_name(tag), 2938be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2939be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2940be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2941be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = delete_camera_metadata_entry(buffer, entry.index); 2942be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 2943be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", 2944be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, 2945be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_section_name(tag), 2946be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2947be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 2948be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 2949be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 2950836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 29516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) { 29526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 29536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 29546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 29556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 29566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 29576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 29586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 29596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 29606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YV12 : // YV12 29616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 29626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RGB_565 : // RGB565 29636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 29646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 29656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 29666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 29676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 29686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 29696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 29703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) { 29713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char *fmt; 29723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala switch(format) { 29733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 29743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 29753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 29773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 29783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 29803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 29813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 29833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 29843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 29863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 29873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 29893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 29903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 29923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 29933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 29943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 29953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala default: 29963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 29973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala __FUNCTION__, format); 29983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = NULL; 29993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 30003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } 30013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return fmt; 30023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala} 30036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) { 30056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 30066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 30076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_AUTO : 30086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 30096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_INCANDESCENT : 30106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 30116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_FLUORESCENT : 30126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 30136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_WARM_FLUORESCENT : 30146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 30156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_DAYLIGHT : 30166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 30176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT : 30186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 30196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_TWILIGHT : 30206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 30216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_SHADE : 30226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 30236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) { 30266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 30276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 30286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_OFF : 30296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 30306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_MONO : 30316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 30326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_NEGATIVE : 30336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 30346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SOLARIZE : 30356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 30366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SEPIA : 30376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 30386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_POSTERIZE : 30396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 30406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_WHITEBOARD : 30416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 30426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_BLACKBOARD : 30436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 30446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_AQUA : 30456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 30466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) { 30496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 30506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 30516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_AUTO : 30526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 30536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_OFF : 30546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 30556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_50HZ : 30566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 30576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_60HZ : 30586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 30596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) { 30626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 30636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 30646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 30656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 30666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 30676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 30686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 30696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 30706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 30716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 30726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 30736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 30746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 30756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 30766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 30776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 30786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 30796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 30806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 30816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 30826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 30836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 30846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 30856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 30866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 30876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 30886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 30896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 30906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 30916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 30926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 30936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 30946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 30956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 30966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 30976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 30986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum( 30996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *flashMode) { 31006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 31016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 31026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 31036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 31046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 31056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 31066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_ON : 31076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 31086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 31096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 31106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 31116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 31126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 31136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 31146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum( 31156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *focusMode) { 31166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 31176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 31186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 31196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 31206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 31216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 31226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 31236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 31246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 31256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 31266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 31276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 31286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 31296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 31306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 31316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 31326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 31336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 31346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr, 31356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> *areas) { 31366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 31376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->clear(); 31386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areasCStr == NULL) { 31396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 31406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->push(); 31416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 31426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala String8 areasStr(areasCStr); 31446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 31456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala while (areaStart != 0) { 31466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 31476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala char *numEnd; 31486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int vals[NUM_FIELDS]; 31496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 31506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 31516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 31526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 31536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala area = numEnd + 1; 31546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->push(Parameters::Area( 31566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 31576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 31586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 31606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 31616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 31626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas, 31636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t maxRegions) { 31646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Definition of valid area can be found in 31656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // include/camera/CameraParameters.h 31666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 31676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() == 1) { 31686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas[0].left == 0 && 31696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].top == 0 && 31706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].right == 0 && 31716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].bottom == 0 && 31726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].weight == 0) { 31736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 31746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 31756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() > maxRegions) { 31786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Too many areas requested: %d", 31796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, areas.size()); 31806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 31816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 31836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 31846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala a != areas.end(); a++) { 31856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 31866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 31876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 31886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 31896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 31906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 31916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 31926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 31936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 31946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 31956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 31966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) { 31976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return !boolStr ? false : 31986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 31996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala false; 32006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 32016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 3202c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalaint Camera2Client::degToTransform(int degrees, bool mirror) { 3203c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (!mirror) { 3204c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (degrees == 0) return 0; 3205c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 3206c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 3207c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 3208c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 3209c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 3210c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 3211c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 3212c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 3213c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 3214c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 3215c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 3216c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 3217c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 3218c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 3219c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 3220c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return -1; 3221c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 32226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 322361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android 3224