Camera2Client.cpp revision c8474b68e435cd840ba66791fb09e3da59f1d93c
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), 558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mDeviceInfo(NULL), 56d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mPreviewStreamId(NO_STREAM), 57228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackStreamId(NO_STREAM), 58228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackHeapId(0), 59d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId(NO_STREAM), 609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingStreamId(NO_STREAM), 61983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingHeapCount(kDefaultRecordingHeapCount) 62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 63a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 64c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGV("%s: Created client for camera %d", __FUNCTION__, cameraId); 6561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice = new Camera2Device(cameraId); 67228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 68228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 69228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = DISCONNECTED; 70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const { 733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala int callingPid = getCallingPid(); 743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if (callingPid == mClientPid) return NO_ERROR; 753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala ALOGE("%s: attempt to use a locked camera from a different process" 773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid); 783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala return PERMISSION_DENIED; 793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala} 803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module) 82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 83a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 84c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId); 85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 87c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mFrameProcessor = new FrameProcessor(this); 88c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala String8 frameThreadName = String8::format("Camera2Client[%d]::FrameProcessor", 89c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mCameraId); 90c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mFrameProcessor->run(frameThreadName.string()); 91c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = mDevice->initialize(module); 93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 99174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala res = mDevice->setNotifyCallback(this); 100174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala res = buildDeviceInfo(); 102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = buildDefaultParameters(); 103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (gLogLevel >= 1) { 110836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 111f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 112f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCameraId); 113836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ALOGD("%s", k.mParameters.paramsFlattened.string()); 114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 11761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 11861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 11961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() { 120a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 121c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGV("%s: Camera %d: Shutting down client.", __FUNCTION__, mCameraId); 1224ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 123f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDestructionStarted = true; 124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1253a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala // Rewrite mClientPid to allow shutdown by CameraService 1263a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mClientPid = getCallingPid(); 127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala disconnect(); 128c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 129c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mFrameProcessor->requestExit(); 130c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGV("%s: Camera %d: Shutdown complete", __FUNCTION__, mCameraId); 13161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 13261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 13361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) { 134611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala String8 result; 1353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", 136611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mCameraId, 137611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala getCameraClient()->asBinder().get(), 138611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mClientPid); 1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" State: "); 1407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 142836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const Parameters& p = mParameters.unsafeUnlock(); 143836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 144228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala result.append(getStateName(p.state)); 1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append("\n Current parameters:\n"); 1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview size: %d x %d\n", 148836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewWidth, p.previewHeight); 1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview FPS range: %d - %d\n", 150836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFpsRange[0], p.previewFpsRange[1]); 1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview HAL pixel format: 0x%x\n", 152836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFormat); 15311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala result.appendFormat(" Preview transform: %x\n", 154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewTransform); 1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Picture size: %d x %d\n", 156836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.pictureWidth, p.pictureHeight); 1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 158836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegThumbSize[0], p.jpegThumbSize[1]); 1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 160836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegQuality, p.jpegThumbQuality); 161836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation); 1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS tags %s\n", 163836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsEnabled ? "enabled" : "disabled"); 164836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (p.gpsEnabled) { 1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 166836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[0], p.gpsCoordinates[1], 167836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[2]); 1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS timestamp: %lld\n", 169836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsTimestamp); 1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS processing method: %s\n", 171836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsProcessingMethod.string()); 1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" White balance mode: "); 175836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.wbMode) { 1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO) 1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT) 1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT) 1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT) 1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT) 1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT) 1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT) 1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE) 1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Effect mode: "); 188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.effectMode) { 1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF) 1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO) 1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE) 1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE) 1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA) 1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE) 1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD) 1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD) 1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA) 1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Antibanding mode: "); 202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.antibandingMode) { 2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO) 2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF) 2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ) 2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ) 2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Scene mode: "); 211836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.sceneMode) { 2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append("AUTO\n"); break; 2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Flash mode: "); 233836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.flashMode) { 2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focus mode: "); 244836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.focusMode) { 2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focusing areas:\n"); 257836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.focusingAreas.size(); i++) { 2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 259836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].left, 260836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].top, 261836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].right, 262836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].bottom, 263836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].weight); 2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Exposure compensation index: %d\n", 267836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.exposureCompensation); 2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" AE lock %s, AWB lock %s\n", 270836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoExposureLock ? "enabled" : "disabled", 271836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoWhiteBalanceLock ? "enabled" : "disabled" ); 2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Metering areas:\n"); 274836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.meteringAreas.size(); i++) { 2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 276836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].left, 277836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].top, 278836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].right, 279836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].bottom, 280836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].weight); 2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 283836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Zoom index: %d\n", p.zoom); 284836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Video size: %d x %d\n", p.videoWidth, 285836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoHeight); 2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Recording hint is %s\n", 288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.recordingHint ? "set" : "not set"); 2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Video stabilization is %s\n", 291836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoStabilization ? "enabled" : "disabled"); 2927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current streams:\n"); 2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Preview stream ID: %d\n", mPreviewStreamId); 2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Capture stream ID: %d\n", mCaptureStreamId); 296836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Recording stream ID: %d\n", mRecordingStreamId); 2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 2983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current requests:\n"); 299cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mPreviewRequest.entryCount() != 0) { 3003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Preview request:\n"); 3013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 302cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mPreviewRequest.dump(fd, 2, 6); 3033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 3043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Preview request: undefined\n"); 3053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 3063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 3073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 308cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mCaptureRequest.entryCount() != 0) { 3093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Capture request:\n"; 3103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 311cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mCaptureRequest.dump(fd, 2, 6); 3123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 3133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Capture request: undefined\n"; 3143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 3153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 3163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 317cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mRecordingRequest.entryCount() != 0) { 318428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala result = " Recording request:\n"; 319428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala write(fd, result.string(), result.size()); 320cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mRecordingRequest.dump(fd, 2, 6); 321428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala } else { 322428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala result = " Recording request: undefined\n"; 323428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala write(fd, result.string(), result.size()); 324428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala } 325428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala 326c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mFrameProcessor->dump(fd, args); 327c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 3283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Device dump:\n"; 329611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala write(fd, result.string(), result.size()); 3307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t res = mDevice->dump(fd, args); 3323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (res != OK) { 3333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Error dumping device: %s (%d)", 3343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala strerror(-res), res); 3353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 3363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 3377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM 339611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala return NO_ERROR; 34061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 34161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3424ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) { 3434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 3444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala switch(state) { 3453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala CASE_ENUM_TO_CHAR(DISCONNECTED) 3464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 3474ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 3484ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 3494ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 3504ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 3514ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 3524ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala default: 3534ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return "Unknown state!"; 3544ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala break; 3554ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 3564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR 3574ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala} 3584ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 35961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface 36061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 36161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() { 362a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 3639e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 364ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 3653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 3663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 367ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 368f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mDevice == 0) return; 369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 37036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala stopPreviewL(); 3716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 372d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 3736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mDevice->deleteStream(mPreviewStreamId); 374d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mPreviewStreamId = NO_STREAM; 375d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 376d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 377d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureStreamId != NO_STREAM) { 378d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice->deleteStream(mCaptureStreamId); 379d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId = NO_STREAM; 3806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 382898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 383898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala mDevice->deleteStream(mRecordingStreamId); 384898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala mRecordingStreamId = NO_STREAM; 385898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala } 386898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 387228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (mCallbackStreamId != NO_STREAM) { 388228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mDevice->deleteStream(mCallbackStreamId); 389228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackStreamId = NO_STREAM; 390228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 391228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 3923a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mDevice.clear(); 393228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 394228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = DISCONNECTED; 3953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 3968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (mDeviceInfo != NULL) { 3978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala delete mDeviceInfo; 3988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mDeviceInfo = NULL; 3998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 4008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 40161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala CameraService::Client::disconnect(); 40261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 40361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 40461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) { 405a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4069e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 407ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 408ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != 0 && getCallingPid() != mClientPid) { 4109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Connection attempt from pid %d; " 4119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "current locked to pid %d", __FUNCTION__, 4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraId, getCallingPid(), mClientPid); 4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return BAD_VALUE; 4149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 4188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala Mutex::Autolock iccl(mICameraClientLock); 4199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient = client; 4209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 421228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 422228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = STOPPED; 423228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 4249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 42561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 42661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 42761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() { 428a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4299e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 430ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 4329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 433ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == 0) { 4359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != getCallingPid()) { 4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 4419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 44661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 44761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 44861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() { 449a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4509e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 451ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 454ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Check for uninterruptable conditions 4569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == getCallingPid()) { 4588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala Mutex::Autolock iccl(mICameraClientLock); 4598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = 0; 4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient.clear(); 4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 46861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 46961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay( 4716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<Surface>& surface) { 472a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4739e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 474ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 4763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 477ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surface != 0) { 4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surface->asBinder(); 4826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = surface; 4836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 48536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder,window); 48661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 48761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture( 4896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<ISurfaceTexture>& surfaceTexture) { 490a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4919e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 492ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 4943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 495ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surfaceTexture != 0) { 4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surfaceTexture->asBinder(); 5006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = new SurfaceTextureClient(surfaceTexture); 5016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 50236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder, window); 5036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 5046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 50536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder, 506be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala sp<ANativeWindow> window) { 507a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 5096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (binder == mPreviewSurface) { 5119e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: New window is same as old window", 5129e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId); 5136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return NO_ERROR; 5146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 516228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 517228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (k.mParameters.state) { 5183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala case DISCONNECTED: 5199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 5209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STILL_CAPTURE: 5219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 5229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 523228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, getStateName(k.mParameters.state)); 5249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 5259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 5269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 5279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK 5289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 5309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Already running preview - need to stop and create a new stream 5319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Optimize this so that we don't wait for old stream to drain 5329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // before spinning up new stream 533cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mDevice->clearStreamingRequest(); 534228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = WAITING_FOR_PREVIEW_WINDOW; 5359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 5379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 538d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 539be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->waitUntilDrained(); 540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 541be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Error waiting for preview to drain: %s (%d)", 542be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 543be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 5456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->deleteStream(mPreviewStreamId); 5466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 547be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Unable to delete old preview stream: %s (%d)", 548be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 5496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 5506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 551be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewStreamId = NO_STREAM; 5526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 554bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala mPreviewSurface = binder; 555be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewWindow = window; 556bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 557228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (k.mParameters.state == WAITING_FOR_PREVIEW_WINDOW) { 558228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return startPreviewL(k.mParameters, false); 5596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 56261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 56361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 56461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) { 565a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 566228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag); 567ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 5683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 569228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 572228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala setPreviewCallbackFlagL(k.mParameters, flag); 573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters ¶ms, int flag) { 576228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res = OK; 577228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) { 578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: setting oneshot", __FUNCTION__); 579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewCallbackOneShot = true; 580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 581228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (params.previewCallbackFlags != (uint32_t)flag) { 582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewCallbackFlags = flag; 583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch(params.state) { 584228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case PREVIEW: 585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startPreviewL(params, true); 586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case RECORD: 588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case VIDEO_SNAPSHOT: 589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startRecordingL(params, true); 590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala default: 592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to refresh request in state %s", 596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, getStateName(params.state)); 597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 60061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 60161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 60261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() { 603a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6049e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 605ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 609228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return startPreviewL(k.mParameters, false); 610d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 611ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters ¶ms, bool restart) { 613d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 6146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (params.state >= PREVIEW && !restart) { 6164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGE("%s: Can't start preview in state %s", 617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, getStateName(params.state)); 6184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return INVALID_OPERATION; 6194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 6206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 621be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewWindow == 0) { 622228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.state = WAITING_FOR_PREVIEW_WINDOW; 6236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 6246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 625228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.state = STOPPED; 6269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 627228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updatePreviewStream(params); 628be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 630be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 631be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 6326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool callbacksEnabled = params.previewCallbackFlags & 634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 635228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateCallbackStream(params); 637228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 638228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 639228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 640228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 641228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 642228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 6436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 644cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mPreviewRequest.entryCount() == 0) { 645228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updatePreviewRequest(params); 646be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 647be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)", 648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 650be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 6516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 653228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 654228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint8_t outputStreams[2] = 655228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala { mPreviewStreamId, mCallbackStreamId }; 656cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mPreviewRequest.update( 657228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 658228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala outputStreams, 2); 659228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } else { 660cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala uint8_t outputStreams[1] = { mPreviewStreamId }; 661cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mPreviewRequest.update( 662228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 663cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala outputStreams, 1); 664228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 6656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)", 6676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 668be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 669be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 670cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mPreviewRequest.sort(); 671be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 672be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)", 673be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 6756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 6786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 679bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview request to start preview: " 680bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala "%s (%d)", 6816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 684228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.state = PREVIEW; 6856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 68761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 68861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 68961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() { 690a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6919e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 692ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 69536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala stopPreviewL(); 696ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala} 697ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 69836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() { 699ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala ATRACE_CALL(); 700228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala State state; 701228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala { 702228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 703228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala state = k.mParameters.state; 704228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 705228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 706228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (state) { 7073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala case DISCONNECTED: 708d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Call before initialized", 709d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 710d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 711d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STOPPED: 712d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 713d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 714d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot stop preview during still capture.", 715d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 716d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 717d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 718228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // no break - identical to preview 719d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 720cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mDevice->clearStreamingRequest(); 7212267106c98f461b730c772a913da946c391a178cEino-Ville Talvala mDevice->waitUntilDrained(); 722228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // no break 723228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: { 724228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 725228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = STOPPED; 726228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala commandStopFaceDetectionL(k.mParameters); 727d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 728228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 729d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 730d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 731228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala state); 732d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 73361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 73461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 73561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() { 736a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 737ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7383a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 7393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return false; 7403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 741228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 742228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return k.mParameters.state == PREVIEW; 74361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 74461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 74561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 746a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 747ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 7493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 7503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 751228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 752228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (k.mParameters.state) { 75378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala case RECORD: 75478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala case VIDEO_SNAPSHOT: 75578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Can't be called in state %s", 756228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, getStateName(k.mParameters.state)); 75778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 75878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala default: 75978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala // OK 76078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala break; 76178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 76278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 763836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.storeMetadataInBuffers = enabled; 76478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 76578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return OK; 76661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 76761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 76861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() { 769a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 7709e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 771ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 7733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 774228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 775228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 776228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return startRecordingL(k.mParameters, false); 777228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 7783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 779228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters ¶ms, bool restart) { 780228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res; 781228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (params.state) { 7829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 783228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startPreviewL(params, false); 7849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) return res; 7859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 7869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 7879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Ready to go 7889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 7899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 7909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 791228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // OK to call this when recording is already on, just skip unless 792228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // we're looking to restart 793228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!restart) return OK; 7949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 7959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 7969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't start recording in state %s", 797228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, getStateName(params.state)); 7989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 7999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 8009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 801228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!params.storeMetadataInBuffers) { 80278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording only supported in metadata mode, but " 80378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "non-metadata recording mode requested!", __FUNCTION__, 80478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mCameraId); 80578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 80678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 80778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateRecordingStream(params); 8099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 8109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 8119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 8139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 814228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool callbacksEnabled = params.previewCallbackFlags & 815228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 816228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateCallbackStream(params); 818228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 820228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 821228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 822228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 823228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 8249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 825cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mRecordingRequest.entryCount() == 0) { 826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateRecordingRequest(params); 8279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 8289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)", 8299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 8309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 8319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 8329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 8339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 834228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 835228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint8_t outputStreams[3] = 836228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala { mPreviewStreamId, mRecordingStreamId, mCallbackStreamId }; 837cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mRecordingRequest.update( 838228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 839228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala outputStreams, 3); 840228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } else { 841228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId }; 842cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mRecordingRequest.update( 843228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 844228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala outputStreams, 2); 845228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 8469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 8479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)", 8489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 8499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 8509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 851cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mRecordingRequest.sort(); 8529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 8539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)", 8549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 8559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 8569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 8579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 8589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mRecordingRequest); 8599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 8609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to set recording request to start " 8619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "recording: %s (%d)", __FUNCTION__, mCameraId, 8629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 8639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 8649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 865228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (params.state < RECORD) { 866228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.state = RECORD; 867228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 8689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 8699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 87061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 87161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 87261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() { 873a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 8749e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 875ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 876228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 877228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 8789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 8793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 8803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 881228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (k.mParameters.state) { 8829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case RECORD: 8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to stop 8849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 8859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STOPPED: 8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case PREVIEW: 8879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case STILL_CAPTURE: 8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala case VIDEO_SNAPSHOT: 8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 8909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop recording in state %s", 891228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, getStateName(k.mParameters.state)); 8929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 8939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 8949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 8959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Back to preview. Since record can only be reached through preview, 8969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // all preview stream setup should be up to date. 8979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 8989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 8999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to switch back to preview request: " 9009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 9019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 9029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 9039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 9049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Should recording heap be freed? Can't do it yet since requests 9059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // could still be in flight. 9069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 907228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = PREVIEW; 90861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 90961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 91061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() { 911a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 912ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 9138da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return false; 9153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 9168da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong return recordingEnabledL(); 9178da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong} 9188da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9198da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() { 9208da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong ATRACE_CALL(); 921228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 9228da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 923228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return (k.mParameters.state == RECORD || k.mParameters.state == VIDEO_SNAPSHOT); 92461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 92561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 92661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 927a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 928ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 9293a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 9303a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 93130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 93230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala LockedParameters::Key k(mParameters); 93330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 9349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Make sure this is for the current heap 9359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ssize_t offset; 9369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size; 9379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 9389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) { 9399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release " 9409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "(got %x, expected %x)", __FUNCTION__, mCameraId, 9419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala heap->getHeapID(), mRecordingHeap->mHeap->getHeapID()); 9429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 9439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 94478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint8_t *data = (uint8_t*)heap->getBase() + offset; 94578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint32_t type = *(uint32_t*)data; 94678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (type != kMetadataBufferTypeGrallocSource) { 94778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)", 94878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource); 94978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return; 95078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 95130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 95230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala // Release the buffer back to the recording queue 95330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 95430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4); 95530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 95630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala size_t itemIndex; 95730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) { 95830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex]; 95930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT && 96030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala item.mGraphicBuffer->handle == imgHandle) { 96130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala break; 96230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala } 96330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala } 96430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala if (itemIndex == mRecordingBuffers.size()) { 96530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of " 96630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala "outstanding buffers", __FUNCTION__, mCameraId, imgHandle); 96730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala return; 96830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala } 96930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 97078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId, 97130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala imgHandle); 97230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 97330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]); 97478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (res != OK) { 97578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):" 97678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "%s (%d)", 97730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala __FUNCTION__, mCameraId, imgHandle, strerror(-res), res); 97878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return; 97978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 98030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala mRecordingBuffers.replaceAt(itemIndex); 98178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 9829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree++; 98361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 98461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 98561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() { 986a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 987ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 9883a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 9893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 9903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 991174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 992174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 993174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala LockedParameters::Key k(mParameters); 994174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.currentAfTriggerId = ++k.mParameters.afTriggerCounter; 995174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala triggerId = k.mParameters.currentAfTriggerId; 996174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 997174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 998174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerAutofocus(triggerId); 999174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 10006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 100161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 100261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 100361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() { 1004a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1005ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 10063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 10073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 10083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 1009174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 1010174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 1011174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala LockedParameters::Key k(mParameters); 1012174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala triggerId = ++k.mParameters.afTriggerCounter; 1013174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1014174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1015174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerCancelAutofocus(triggerId); 1016174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 10176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 101861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 101961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 102061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) { 1021a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1022ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 1023d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 10243a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1025d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1026228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 1027228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (k.mParameters.state) { 10283a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala case DISCONNECTED: 1029d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STOPPED: 1030d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 1031d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 1032d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 1033d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 1034d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 1035d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 1036d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Good to go for takePicture 1037d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1038d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 1039d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case VIDEO_SNAPSHOT: 1040d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Already taking a picture", 1041d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 1042d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 1043d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1044d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 10458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId); 1046d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1047228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateCaptureStream(k.mParameters); 1048228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 1049228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 1050228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1051228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 1052228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 10538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1054cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mCaptureRequest.entryCount() == 0) { 1055228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateCaptureRequest(k.mParameters); 10564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 1057228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Can't create still image capture request: " 1058228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 10594ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 10604ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 1061d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1062d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1063228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool callbacksEnabled = k.mParameters.previewCallbackFlags & 1064228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 1065228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool recordingEnabled = (k.mParameters.state == RECORD); 1066228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 1067228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala int streamSwitch = (callbacksEnabled ? 0x2 : 0x0) + 1068228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala (recordingEnabled ? 0x1 : 0x0); 1069228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch ( streamSwitch ) { 1070228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case 0: { // No recording, callbacks 1071228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId }; 1072cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 1073cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala streamIds, 2); 1074228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 1075228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 1076228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case 1: { // Recording 1077228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId, 1078228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCaptureStreamId }; 1079cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 1080cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala streamIds, 3); 1081228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 1082228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 1083228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case 2: { // Callbacks 1084228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint8_t streamIds[3] = { mPreviewStreamId, mCallbackStreamId, 1085228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCaptureStreamId }; 1086cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 1087cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala streamIds, 3); 1088228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 1089228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 1090228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case 3: { // Both 1091228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint8_t streamIds[4] = { mPreviewStreamId, mCallbackStreamId, 1092228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mRecordingStreamId, mCaptureStreamId }; 1093cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 1094cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala streamIds, 4); 1095228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 1096228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 1097228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala }; 1098d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1099d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still image capture request: " 1100d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 1101d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1102d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 1103d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.sort(); 1105be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 1106be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)", 1107be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1108be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 1109be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 1110d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1111cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala CameraMetadata captureCopy = mCaptureRequest; 1112cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (captureCopy.entryCount() == 0) { 1113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 1114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 1115d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return NO_MEMORY; 1116d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1117d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1118228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (k.mParameters.state == PREVIEW) { 1119cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mDevice->clearStreamingRequest(); 1120d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1121d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 1122d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 1123d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1124d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 1125d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1126d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 11279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 1128d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->capture(captureCopy); 1129d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1130d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 1131d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", 1132d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1133d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 1134d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1135d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1136228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (k.mParameters.state) { 1137d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case PREVIEW: 1138228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = STILL_CAPTURE; 1139228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = commandStopFaceDetectionL(k.mParameters); 11408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 11418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop face detection for still capture", 11428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 11438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 11448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1145d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1146d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case RECORD: 1147228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = VIDEO_SNAPSHOT; 1148d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 1149d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 1150d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state for still capture!", 1151d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 1152d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 1153d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1154d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1155d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 115661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 115761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 115861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) { 1159a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 11609e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 1161ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala status_t res; 11633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 11643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 11653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala LockedParameters::Key k(mParameters); 11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala CameraParameters newParams(params); 11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only 11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // parameters such as supported preview sizes, etc. Should probably 11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // produce an error if they're changed. 11726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala /** Extract and verify new parameters */ 11746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t i; 11766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_SIZE 11786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int previewWidth, previewHeight; 11796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getPreviewSize(&previewWidth, &previewHeight); 11806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 1181836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewWidth != k.mParameters.previewWidth || 1182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala previewHeight != k.mParameters.previewHeight) { 1183228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (k.mParameters.state >= PREVIEW) { 11846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 11859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 11869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, 1187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth, k.mParameters.previewHeight, 11889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala previewWidth, previewHeight); 11896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 11906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 1191cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availablePreviewSizes = 11926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 11936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePreviewSizes.count; i += 2 ) { 11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availablePreviewSizes.data.i32[i] == previewWidth && 11956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availablePreviewSizes.data.i32[i+1] == previewHeight) break; 11966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 11976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePreviewSizes.count) { 11986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 11996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, previewWidth, previewHeight); 12006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FPS_RANGE 120511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int previewFpsRange[2]; 120611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int previewFps = 0; 12076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool fpsRangeChanged = false; 120811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]); 1209836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFpsRange[0] != k.mParameters.previewFpsRange[0] || 1210836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala previewFpsRange[1] != k.mParameters.previewFpsRange[1]) { 12116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala fpsRangeChanged = true; 1212cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availablePreviewFpsRanges = 12136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 12146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 12156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 121611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[0]) && 12176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 121811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1]) ) { 12196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala break; 12206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 12236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 122411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala __FUNCTION__, previewFpsRange[0], previewFpsRange[1]); 12256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 122711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFps = previewFpsRange[0]; 12286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FORMAT 12316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int previewFormat = formatStringToEnum(newParams.getPreviewFormat()); 1232836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFormat != k.mParameters.previewFormat) { 1233228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (k.mParameters.state >= PREVIEW) { 12346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 12356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "is active!", __FUNCTION__); 12366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 1238cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableFormats = 12396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 12406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFormats.count; i++) { 12416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableFormats.data.i32[i] == previewFormat) break; 12426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFormats.count) { 12446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 12456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), previewFormat); 12466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PREVIEW_FRAME_RATE 12516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Deprecated, only use if the preview fps range is unchanged this time. 12526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // The single-value FPS is the same as the minimum of the range. 12536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (!fpsRangeChanged) { 12546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala previewFps = newParams.getPreviewFrameRate(); 1255836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (previewFps != k.mParameters.previewFps) { 1256cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableFrameRates = 12576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 12586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 12596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableFrameRates.data.i32[i] == previewFps) break; 12606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFrameRates.count) { 12626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 12636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, previewFps); 12646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 126611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[0] = availableFrameRates.data.i32[i]; 126711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala previewFpsRange[1] = availableFrameRates.data.i32[i+1]; 12686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // PICTURE_SIZE 12726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int pictureWidth, pictureHeight; 12736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getPictureSize(&pictureWidth, &pictureHeight); 1274836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (pictureWidth == k.mParameters.pictureWidth || 1275836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala pictureHeight == k.mParameters.pictureHeight) { 1276cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availablePictureSizes = 12776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 12786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availablePictureSizes.count; i+=2) { 12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availablePictureSizes.data.i32[i] == pictureWidth && 12806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availablePictureSizes.data.i32[i+1] == pictureHeight) break; 12816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availablePictureSizes.count) { 12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 12846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, pictureWidth, pictureHeight); 12856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 12866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 12886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 129011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int jpegThumbSize[2]; 129111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[0] = 12926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 129311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala jpegThumbSize[1] = 12946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 1295836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (jpegThumbSize[0] != k.mParameters.jpegThumbSize[0] || 1296836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala jpegThumbSize[1] != k.mParameters.jpegThumbSize[1]) { 1297cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbSizes = 12986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 12996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 130011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] && 130111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) { 13026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala break; 13036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 13066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 130711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]); 13086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 13136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegThumbQuality = 13146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 13156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegThumbQuality < 0 || jpegThumbQuality > 100) { 13166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 13176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegThumbQuality); 13186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // JPEG_QUALITY 13226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegQuality = 13236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 13246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegQuality < 0 || jpegQuality > 100) { 13256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 13266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegQuality); 13276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ROTATION 13316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int jpegRotation = 13326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 13336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (jpegRotation != 0 && 13346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 90 && 13356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 180 && 13366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala jpegRotation != 270) { 13376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 13386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, jpegRotation); 13396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // GPS 13436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool gpsEnabled = false; 134411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala double gpsCoordinates[3] = {0,0,0}; 13456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int64_t gpsTimestamp = 0; 13466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala String8 gpsProcessingMethod; 13476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsLatStr = 13486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 13496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (gpsLatStr != NULL) { 13506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsLongStr = 13516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 13526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsAltitudeStr = 13536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 13546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsTimeStr = 13556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 13566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *gpsProcMethodStr = 13576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 13586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (gpsLongStr == NULL || 13596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsAltitudeStr == NULL || 13606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsTimeStr == NULL || 13616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsProcMethodStr == NULL) { 13626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 13636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__); 13646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala char *endPtr; 13676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 136811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 13696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 13706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 13716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 137411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 13756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 13766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 13776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 138011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 13816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 13826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 13836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsAltitudeStr); 13846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 13876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 13886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 13896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 13906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 13916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsProcessingMethod = gpsProcMethodStr; 13936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala gpsEnabled = true; 13956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 13966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 13976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // WHITE_BALANCE 13986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int wbMode = wbModeStringToEnum( 13996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 1400836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (wbMode != k.mParameters.wbMode) { 1401cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableWbModes = 14026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 14036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 14046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (wbMode == availableWbModes.data.u8[i]) break; 14056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableWbModes.count) { 14076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 14086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 14096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 14106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // EFFECT 14156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int effectMode = effectModeStringToEnum( 14166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 1417836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (effectMode != k.mParameters.effectMode) { 1418cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableEffectModes = 14196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 14206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 14216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (effectMode == availableEffectModes.data.u8[i]) break; 14226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableEffectModes.count) { 14246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 14256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 14266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 14276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ANTIBANDING 14326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int antibandingMode = abModeStringToEnum( 14336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 1434836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (antibandingMode != k.mParameters.antibandingMode) { 1435cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableAbModes = 14366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 14376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 14386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (antibandingMode == availableAbModes.data.u8[i]) break; 14396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableAbModes.count) { 14416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 14426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 14436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 14446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // SCENE_MODE 14496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int sceneMode = sceneModeStringToEnum( 14506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 14513cc89794d92b833feff15ca76dfa196cc886e43fEino-Ville Talvala if (sceneMode != k.mParameters.sceneMode && 14523cc89794d92b833feff15ca76dfa196cc886e43fEino-Ville Talvala sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) { 1453cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 14546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 14556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 14566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (sceneMode == availableSceneModes.data.u8[i]) break; 14576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableSceneModes.count) { 14596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 14606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 14616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 14626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FLASH_MODE 14676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::flashMode_t flashMode = flashModeStringToEnum( 14686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 1469836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (flashMode != k.mParameters.flashMode) { 1470cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 14716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 14726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (!flashAvailable.data.u8[0] && 14736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala flashMode != Parameters::FLASH_MODE_OFF) { 14746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 14756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "No flash on device", __FUNCTION__, 14766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 14776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) { 1479cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 14806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 14816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 14826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (flashMode == availableAeModes.data.u8[i]) break; 14836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableAeModes.count) { 14856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 14866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 14876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 14886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (flashMode == -1) { 14916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 14926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 14936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 14946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 14956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 14976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 14986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FOCUS_MODE 14996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::focusMode_t focusMode = focusModeStringToEnum( 15006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 1501836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (focusMode != k.mParameters.focusMode) { 15026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode != Parameters::FOCUS_MODE_FIXED) { 1503cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 15046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE); 15056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 15066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 15076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala "fixed focus lens", 15086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 15096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 15106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 15116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) { 1512cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableFocusModes = 15136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 15146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 15156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (focusMode == availableFocusModes.data.u8[i]) break; 15166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 15176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableFocusModes.count) { 15186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 15196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 15206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 15216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 15226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 15236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 15246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 15256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 15266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 15276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // FOCUS_AREAS 15286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> focusingAreas; 15296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 15306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala &focusingAreas); 15316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t max3aRegions = 15326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 15336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 15346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res != OK) { 15356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 15366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 15376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 15386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 15396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 15406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // EXPOSURE_COMPENSATION 15416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int exposureCompensation = 15426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 1543cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 15446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE); 15456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (exposureCompensation < exposureCompensationRange.data.i32[0] || 15466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala exposureCompensation > exposureCompensationRange.data.i32[1]) { 15476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 15486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, exposureCompensation); 15496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 15506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 15516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 15526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // AUTO_EXPOSURE_LOCK (always supported) 15536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool autoExposureLock = boolFromString( 15546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 15556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 15566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // AUTO_WHITEBALANCE_LOCK (always supported) 15576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool autoWhiteBalanceLock = boolFromString( 15586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 15596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 15606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // METERING_AREAS 15616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> meteringAreas; 15626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 15636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala &meteringAreas); 15646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 15656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (res != OK) { 15666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 15676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, 15686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 15696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 15706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 15716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 15726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // ZOOM 15736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 15746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) { 15756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested zoom level %d is not supported", 15766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, zoom); 15776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 15786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 15796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 15806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // VIDEO_SIZE 15816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int videoWidth, videoHeight; 15826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.getVideoSize(&videoWidth, &videoHeight); 1583836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (videoWidth != k.mParameters.videoWidth || 1584836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala videoHeight != k.mParameters.videoHeight) { 1585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (k.mParameters.state == RECORD) { 15866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Video size cannot be updated when recording is active!", 15876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__); 15886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 15896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 1590cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoSizes = 15916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 15926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (i = 0; i < availableVideoSizes.count; i += 2 ) { 15936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (availableVideoSizes.data.i32[i] == videoWidth && 15946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala availableVideoSizes.data.i32[i+1] == videoHeight) break; 15956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 15966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (i == availableVideoSizes.count) { 15976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Requested video size %d x %d is not supported", 15986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, videoWidth, videoHeight); 15996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 16006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 16016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 16026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 16036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // RECORDING_HINT (always supported) 16046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool recordingHint = boolFromString( 16056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 16066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 16076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // VIDEO_STABILIZATION 16086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala bool videoStabilization = boolFromString( 16096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 1610cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 16116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 16126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (videoStabilization && availableVideoStabilizationModes.count == 1) { 16136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 16146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 16156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 16166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala /** Update internal parameters */ 16179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1618836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth = previewWidth; 1619836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewHeight = previewHeight; 1620836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0] = previewFpsRange[0]; 1621836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1] = previewFpsRange[1]; 1622836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFps = previewFps; 1623836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFormat = previewFormat; 1624836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1625836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureWidth = pictureWidth; 1626836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight = pictureHeight; 1627836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1628836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0] = jpegThumbSize[0]; 1629836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1] = jpegThumbSize[1]; 1630836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality = jpegQuality; 1631836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality = jpegThumbQuality; 1632836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1633836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsEnabled = gpsEnabled; 1634836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[0] = gpsCoordinates[0]; 1635836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[1] = gpsCoordinates[1]; 1636836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsCoordinates[2] = gpsCoordinates[2]; 1637836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsTimestamp = gpsTimestamp; 1638836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsProcessingMethod = gpsProcessingMethod; 1639836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1640836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.wbMode = wbMode; 1641836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.effectMode = effectMode; 1642836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.antibandingMode = antibandingMode; 1643836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.sceneMode = sceneMode; 1644836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1645836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = flashMode; 1646174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (focusMode != k.mParameters.focusMode) { 1647174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.currentAfTriggerId = -1; 1648174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1649836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = focusMode; 1650836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1651836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas = focusingAreas; 1652836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation = exposureCompensation; 1653836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoExposureLock = autoExposureLock; 1654836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock; 1655836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.meteringAreas = meteringAreas; 1656836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.zoom = zoom; 1657836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1658836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoWidth = videoWidth; 1659836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoHeight = videoHeight; 1660836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1661836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.recordingHint = recordingHint; 1662836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoStabilization = videoStabilization; 1663836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1664836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.paramsFlattened = params; 16659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 16668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala res = updateRequests(k.mParameters); 16678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 16688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 166961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 1670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 167161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const { 1672a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1673ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 16743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return String8(); 1675ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 1676836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::ReadKey k(mParameters); 1677ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 16783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala // TODO: Deal with focus distances 1679836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala return k.mParameters.paramsFlattened; 168061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 168161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 168261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1683a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1684ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 16853a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 16863a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1687c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1688c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1689c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala cmd, arg1, arg2); 1690c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 169136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala switch (cmd) { 169236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_SMOOTH_ZOOM: 169336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartSmoothZoomL(); 169436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_STOP_SMOOTH_ZOOM: 169536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStopSmoothZoomL(); 169636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_DISPLAY_ORIENTATION: 169736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetDisplayOrientationL(arg1); 169836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_SHUTTER_SOUND: 169936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableShutterSoundL(arg1 == 1); 170036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PLAY_RECORDING_SOUND: 170136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPlayRecordingSoundL(); 170236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_FACE_DETECTION: 170336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartFaceDetectionL(arg1); 1704228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case CAMERA_CMD_STOP_FACE_DETECTION: { 1705228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 1706228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return commandStopFaceDetectionL(k.mParameters); 1707228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 170836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG: 170936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableFocusMoveMsgL(arg1 == 1); 171036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PING: 171136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPingL(); 171236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT: 171336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetVideoBufferCountL(arg1); 171436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala default: 171536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unknown command %d (arguments %d, %d)", 171636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, cmd, arg1, arg2); 1717c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 171836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 171936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 172036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 172136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() { 172236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 172336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 172436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 172536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 172636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() { 172736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 172836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 172936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 173036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 173136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) { 173236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala LockedParameters::Key k(mParameters); 173336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala int transform = degToTransform(degrees, 173436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 173536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (transform == -1) { 173636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as display orientation value", 173736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, mCameraId, degrees); 173836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return BAD_VALUE; 173936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 174036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (transform != k.mParameters.previewTransform && 174136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mPreviewStreamId != NO_STREAM) { 174236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mDevice->setStreamTransform(mPreviewStreamId, transform); 174336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 174436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala k.mParameters.previewTransform = transform; 174536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 174636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 174736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 174836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) { 174936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala LockedParameters::Key k(mParameters); 175036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (enable) { 175136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala k.mParameters.playShutterSound = true; 1752c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return OK; 175336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1754983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 175536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound may not be allowed. In that case only 175636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // allow the mediaserver process to disable the sound. 175736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala char value[PROPERTY_VALUE_MAX]; 175836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala property_get("ro.camera.sound.forced", value, "0"); 175936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (strncmp(value, "0", 2) != 0) { 176036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound is not allowed. Deny if the current 176136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // process is not mediaserver. 176236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (getCallingPid() != getpid()) { 176336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("Failed to disable shutter sound. Permission denied (pid %d)", 176436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala getCallingPid()); 176536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return PERMISSION_DENIED; 1766983cf231ab2d176a14595cdae46ff1b0c239af47James Dong } 176736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1768983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 176936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala k.mParameters.playShutterSound = false; 177036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 177136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 1772983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 177336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() { 177436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 177536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 177636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 177736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 177836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartFaceDetectionL(int type) { 17798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Starting face detection", 17808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 17818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 1782228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 1783228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (k.mParameters.state) { 17848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala case DISCONNECTED: 17858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala case STOPPED: 17868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala case WAITING_FOR_PREVIEW_WINDOW: 17878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala case STILL_CAPTURE: 17888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot start face detection without preview active", 17898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 17908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return INVALID_OPERATION; 17918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala case PREVIEW: 17928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala case RECORD: 17938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala case VIDEO_SNAPSHOT: 17948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // Good to go for starting face detect 17958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala break; 17968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 17978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // Ignoring type 17988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (mDeviceInfo->bestFaceDetectMode == ANDROID_STATS_FACE_DETECTION_OFF) { 17998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Face detection not supported", 18008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 18018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return INVALID_OPERATION; 18028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 18038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (k.mParameters.enableFaceDetect) return OK; 18048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 18058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala k.mParameters.enableFaceDetect = true; 18068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 18078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala res = updateRequests(k.mParameters); 18088ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 18098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 181036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 181136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1812228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters ¶ms) { 18138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res = OK; 18148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Stopping face detection", 18158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 18168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!params.enableFaceDetect) return OK; 18188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.enableFaceDetect = false; 18208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1821228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (params.state == PREVIEW || params.state == RECORD || 1822228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.state == VIDEO_SNAPSHOT) { 1823228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateRequests(params); 18248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 18258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 18268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 182736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 182836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 182936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) { 1830174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala LockedParameters::Key k(mParameters); 1831174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.enableFocusMoveMessages = enable; 1832174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 183336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 183436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 183536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 183636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() { 183736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Always ping back if access is proper and device is alive 1838228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 1839228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (k.mParameters.state != DISCONNECTED) { 1840983cf231ab2d176a14595cdae46ff1b0c239af47James Dong return OK; 184136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } else { 184236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return NO_INIT; 184336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 184436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 184536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 184636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) { 18478da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong if (recordingEnabledL()) { 184836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting video buffer count after " 184936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala "recording was started", __FUNCTION__, mCameraId); 185036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return INVALID_OPERATION; 1851c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1852c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 185336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // 32 is the current upper limit on the video buffer count for BufferQueue 185436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (count > 32) { 185536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as video buffer count value", 185636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, mCameraId, count); 185736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return BAD_VALUE; 185836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 185936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 186036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Need to reallocate memory for heap 186136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (mRecordingHeapCount != count) { 186236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (mRecordingHeap != 0) { 186336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mRecordingHeap.clear(); 186436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mRecordingHeap = NULL; 186536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 186636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mRecordingHeapCount = count; 186736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1868c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 18696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 187061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 187161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 18723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */ 18733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1874160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) { 1875160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2); 1876160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1877160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1878160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) { 1879160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__, 1880160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala frameNumber, timestamp); 1881160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1882160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1883160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) { 1884160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autofocus state now %d, last trigger %d", 1885160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1886174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendCompletedMessage = false; 1887174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendMovingMessage = false; 1888174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1889174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool success = false; 1890174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool afInMotion = false; 1891174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 1892174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala LockedParameters::Key k(mParameters); 1893174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (k.mParameters.focusMode) { 1894174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 1895174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 1896174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for the current AF 1897174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // trigger. For example, if cancel was called in between, or if we 1898174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // already sent a notification about this AF call. 1899174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (triggerId != k.mParameters.currentAfTriggerId) break; 1900174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1901174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1902174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1903174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1904174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1905174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 1906174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.currentAfTriggerId = -1; 1907174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1908174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 1909174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Just starting focusing, ignore 1910174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1911174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1912174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1913174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1914174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1915174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Unexpected in AUTO/MACRO mode 1916174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d", 1917174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, newState); 1918174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1919174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1920174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1921174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1922174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1923174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1924174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1925174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1926174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1927174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1928174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for 1929174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // the current AF trigger. For example, if cancel was 1930174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // called in between, or if we already sent a 1931174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // notification about this AF call. 1932174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Send both a 'AF done' callback and a 'AF move' callback 1933174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (triggerId != k.mParameters.currentAfTriggerId) break; 1934174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 1935174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 1936174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (k.mParameters.enableFocusMoveMessages && 1937174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.afInMotion) { 1938174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1939174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1940174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.currentAfTriggerId = -1; 1941174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1942174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1943174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Cancel was called, or we switched state; care if 1944174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // currently moving 1945174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 1946174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (k.mParameters.enableFocusMoveMessages && 1947174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.afInMotion) { 1948174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1949174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1950174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1951174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1952174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Start passive scan, inform upstream 1953174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = true; 1954174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1955174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1956174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Stop passive scan, inform upstream 1957174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (k.mParameters.enableFocusMoveMessages) { 1958174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1959174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1960174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1961174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1962174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.afInMotion = afInMotion; 1963174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1964174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 1965174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 1966174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 1967174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1968174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) { 1969174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Unexpected AF state change %d (ID %d) in focus mode %d", 1970174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, newState, triggerId, k.mParameters.focusMode); 1971174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1972174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1973174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1974174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (sendMovingMessage) { 19758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala Mutex::Autolock iccl(mICameraClientLock); 19768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (mCameraClient != 0) { 19778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE, 19788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala afInMotion ? 1 : 0, 0); 19798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1980174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1981603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala if (sendCompletedMessage) { 19828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala Mutex::Autolock iccl(mICameraClientLock); 19838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (mCameraClient != 0) { 19848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, success ? 1 : 0, 0); 19858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1986603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala } 1987160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1988160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1989160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) { 1990160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autoexposure state now %d, last trigger %d", 1991160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1992160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1993160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1994160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) { 1995160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Auto-whitebalance state now %d, last trigger %d", 1996160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1997160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1998160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1999c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville TalvalaCamera2Client::FrameProcessor::FrameProcessor(wp<Camera2Client> client): 2000c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala Thread(false), mClient(client) { 2001c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 2002c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 2003c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville TalvalaCamera2Client::FrameProcessor::~FrameProcessor() { 2004c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGV("%s: Exit", __FUNCTION__); 2005c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 2006c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 2007c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalavoid Camera2Client::FrameProcessor::dump(int fd, const Vector<String16>& args) { 2008c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala String8 result(" Latest received frame:\n"); 2009c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala write(fd, result.string(), result.size()); 2010c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mLastFrame.dump(fd, 2, 6); 2011c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 2012c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 2013c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalabool Camera2Client::FrameProcessor::threadLoop() { 2014c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala status_t res; 2015c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 2016c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala sp<Camera2Device> device; 2017c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala { 2018c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 2019c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala if (client == 0) return false; 2020c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala device = client->mDevice; 2021c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala } 2022c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 2023c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala res = device->waitForNextFrame(kWaitDuration); 2024c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala if (res == OK) { 2025c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 2026c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala if (client == 0) return false; 2027c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala processNewFrames(client); 2028c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala } else if (res != TIMED_OUT) { 2029c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGE("Camera2Client::FrameProcessor: Error waiting for new " 2030c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala "frames: %s (%d)", strerror(-res), res); 2031c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala } 2032c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 2033c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala return true; 2034c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 2035c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 2036c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalavoid Camera2Client::FrameProcessor::processNewFrames(sp<Camera2Client> &client) { 20378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 2038cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala CameraMetadata frame; 2039c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala while ( (res = client->mDevice->getNextFrame(&frame)) == OK) { 2040cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 2041cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry = frame.find(ANDROID_REQUEST_FRAME_COUNT); 2042cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (entry.count == 0) { 2043cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Camera %d: Error reading frame number: %s (%d)", 2044c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala __FUNCTION__, client->mCameraId, strerror(-res), res); 2045cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala break; 20468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 20478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2048c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala res = processFaceDetect(frame, client); 2049cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) break; 2050c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 2051c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mLastFrame.acquire(frame); 2052cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2053cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != NOT_ENOUGH_DATA) { 2054cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Camera %d: Error getting next frame: %s (%d)", 2055c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala __FUNCTION__, client->mCameraId, strerror(-res), res); 2056cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return; 20578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 2058cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 20598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return; 20608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 20618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2062c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalastatus_t Camera2Client::FrameProcessor::processFaceDetect( 2063c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala const CameraMetadata &frame, sp<Camera2Client> &client) { 20648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 2065cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t entry; 20668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala bool enableFaceDetect; 20678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala { 2068c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala LockedParameters::Key k(client->mParameters); 20698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala enableFaceDetect = k.mParameters.enableFaceDetect; 20708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 2071cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry = frame.find(ANDROID_STATS_FACE_DETECT_MODE); 2072cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 2073cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // TODO: This should be an error once implementations are compliant 2074cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (entry.count == 0) { 207576dc8dacbb3e2a8c91cb526293270f9093cf8f8bEino-Ville Talvala return OK; 20768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 2077cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 20788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala uint8_t faceDetectMode = entry.data.u8[0]; 20798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 20808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (enableFaceDetect && faceDetectMode != ANDROID_STATS_FACE_DETECTION_OFF) { 2081cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry = frame.find(ANDROID_STATS_FACE_RECTANGLES); 2082cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (entry.count == 0) { 2083cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to read face rectangles", 2084c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala __FUNCTION__, client->mCameraId); 20858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 20868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 20878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala camera_frame_metadata metadata; 20888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala metadata.number_of_faces = entry.count / 4; 20898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (metadata.number_of_faces > 2090c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala client->mDeviceInfo->maxFaces) { 20918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: More faces than expected! (Got %d, max %d)", 2092c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala __FUNCTION__, client->mCameraId, 2093c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala metadata.number_of_faces, client->mDeviceInfo->maxFaces); 20948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 20958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 2096cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int32_t *faceRects = entry.data.i32; 20978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2098cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry = frame.find(ANDROID_STATS_FACE_SCORES); 2099cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (entry.count == 0) { 2100cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to read face scores", 2101c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala __FUNCTION__, client->mCameraId); 21028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 21038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 2104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const uint8_t *faceScores = entry.data.u8; 21058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2106cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int32_t *faceLandmarks = NULL; 2107cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int32_t *faceIds = NULL; 21088ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 21098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (faceDetectMode == ANDROID_STATS_FACE_DETECTION_FULL) { 2110cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry = frame.find(ANDROID_STATS_FACE_LANDMARKS); 2111cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (entry.count == 0) { 2112cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to read face landmarks", 2113c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala __FUNCTION__, client->mCameraId); 21148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 21158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 21168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala faceLandmarks = entry.data.i32; 21178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2118cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry = frame.find(ANDROID_STATS_FACE_IDS); 2119cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 2120cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (entry.count == 0) { 2121cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to read face IDs", 2122c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala __FUNCTION__, client->mCameraId); 21238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 21248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 21258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala faceIds = entry.data.i32; 21268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 21278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 21288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala Vector<camera_face_t> faces; 21298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala faces.setCapacity(metadata.number_of_faces); 21308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 21318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala for (int i = 0; i < metadata.number_of_faces; i++) { 21328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala camera_face_t face; 21338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2134c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala face.rect[0] = client->arrayXToNormalized(faceRects[i*4 + 0]); 2135c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala face.rect[1] = client->arrayYToNormalized(faceRects[i*4 + 1]); 2136c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala face.rect[2] = client->arrayXToNormalized(faceRects[i*4 + 2]); 2137c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala face.rect[3] = client->arrayYToNormalized(faceRects[i*4 + 3]); 21388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 21398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala face.score = faceScores[i]; 21408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (faceDetectMode == ANDROID_STATS_FACE_DETECTION_FULL) { 21418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala face.id = faceIds[i]; 2142c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala face.left_eye[0] = 2143c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala client->arrayXToNormalized(faceLandmarks[i*6 + 0]); 2144c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala face.left_eye[1] = 2145c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala client->arrayYToNormalized(faceLandmarks[i*6 + 1]); 2146c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala face.right_eye[0] = 2147c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala client->arrayXToNormalized(faceLandmarks[i*6 + 2]); 2148c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala face.right_eye[1] = 2149c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala client->arrayYToNormalized(faceLandmarks[i*6 + 3]); 2150c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala face.mouth[0] = 2151c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala client->arrayXToNormalized(faceLandmarks[i*6 + 4]); 2152c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala face.mouth[1] = 2153c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala client->arrayYToNormalized(faceLandmarks[i*6 + 5]); 21548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } else { 21558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala face.id = 0; 21568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala face.left_eye[0] = face.left_eye[1] = -2000; 21578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala face.right_eye[0] = face.right_eye[1] = -2000; 21588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala face.mouth[0] = face.mouth[1] = -2000; 21598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 21608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala faces.push_back(face); 21618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 21628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 21638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala metadata.faces = faces.editArray(); 21648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala { 2165c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala Mutex::Autolock iccl(client->mICameraClientLock); 2166c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala if (client->mCameraClient != NULL) { 2167c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala client->mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_METADATA, 21688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala NULL, &metadata); 21698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 21708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 21718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 21728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return OK; 21738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 21748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2175228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::onCallbackAvailable() { 2176d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 2177d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 2178228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Camera %d: Preview callback available", __FUNCTION__, mCameraId); 2179228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2180228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala int callbackHeapId; 2181228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala sp<Camera2Heap> callbackHeap; 2182228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t heapIdx; 21839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2184d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala CpuConsumer::LockedBuffer imgBuffer; 2185228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Getting buffer", __FUNCTION__); 2186228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = mCallbackConsumer->lockNextBuffer(&imgBuffer); 2187228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 2188228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Error receiving next callback buffer: " 2189228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2190228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return; 2191228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2192228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2193d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala { 2194228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 2195d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2196228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if ( k.mParameters.state != PREVIEW && k.mParameters.state != RECORD 2197228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala && k.mParameters.state != VIDEO_SNAPSHOT) { 2198228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Camera %d: No longer streaming", 2199228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId); 2200228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer->unlockBuffer(imgBuffer); 2201228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return; 2202228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2203228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2204228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (! (k.mParameters.previewCallbackFlags & 2205228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ) { 2206228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: No longer enabled, dropping", __FUNCTION__); 2207228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer->unlockBuffer(imgBuffer); 2208228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return; 2209228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2210228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if ((k.mParameters.previewCallbackFlags & 2211228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) && 2212228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala !k.mParameters.previewCallbackOneShot) { 2213228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: One shot mode, already sent, dropping", __FUNCTION__); 2214228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer->unlockBuffer(imgBuffer); 2215228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return; 2216228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2217228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2218228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (imgBuffer.format != k.mParameters.previewFormat) { 2219228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected format for callback: " 2220228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala "%x, expected %x", __FUNCTION__, mCameraId, 2221228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala imgBuffer.format, k.mParameters.previewFormat); 2222228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer->unlockBuffer(imgBuffer); 2223228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return; 2224228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2225228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2226228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t bufferSize = calculateBufferSize(imgBuffer.width, imgBuffer.height, 2227228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala imgBuffer.format, imgBuffer.stride); 2228228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t currentBufferSize = (mCallbackHeap == 0) ? 2229228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 0 : (mCallbackHeap->mHeap->getSize() / kCallbackHeapCount); 2230228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (bufferSize != currentBufferSize) { 2231228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackHeap.clear(); 2232228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackHeap = new Camera2Heap(bufferSize, kCallbackHeapCount, 2233228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala "Camera2Client::CallbackHeap"); 2234228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (mCallbackHeap->mHeap->getSize() == 0) { 2235228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for callbacks", 2236228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId); 2237228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer->unlockBuffer(imgBuffer); 2238228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return; 2239228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2240228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2241228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackHeapHead = 0; 2242228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackHeapFree = kCallbackHeapCount; 2243228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackHeapId++; 2244228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2245228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2246228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (mCallbackHeapFree == 0) { 2247228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: No free callback buffers, dropping frame", 2248d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 2249228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer->unlockBuffer(imgBuffer); 2250d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 2251d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2252228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala heapIdx = mCallbackHeapHead; 2253228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala callbackHeap = mCallbackHeap; 2254228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala callbackHeapId = mCallbackHeapId; 2255228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2256228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackHeapHead = (mCallbackHeapHead + 1) & kCallbackHeapCount; 2257228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackHeapFree--; 2258228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2259228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // TODO: Get rid of this memcpy by passing the gralloc queue all the way 2260228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // to app 2261228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2262228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ssize_t offset; 2263228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t size; 2264228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala sp<IMemoryHeap> heap = 2265228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackHeap->mBuffers[heapIdx]->getMemory(&offset, 2266228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala &size); 2267228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint8_t *data = (uint8_t*)heap->getBase() + offset; 2268228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala memcpy(data, imgBuffer.data, bufferSize); 2269228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2270228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Freeing buffer", __FUNCTION__); 2271228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer->unlockBuffer(imgBuffer); 2272228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2273228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // In one-shot mode, stop sending callbacks after the first one 2274228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (k.mParameters.previewCallbackFlags & 2275228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) { 2276228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: clearing oneshot", __FUNCTION__); 2277228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.previewCallbackOneShot = false; 2278228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2279228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2280228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2281228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // Call outside parameter lock to allow re-entrancy from notification 2282228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala { 2283228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala Mutex::Autolock iccl(mICameraClientLock); 2284228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (mCameraClient != 0) { 2285228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Camera %d: Invoking client data callback", 2286228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId); 2287228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_FRAME, 2288228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala callbackHeap->mBuffers[heapIdx], NULL); 2289228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2290228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2291228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2292228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 2293228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // Only increment free if we're still using the same heap 2294228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (mCallbackHeapId == callbackHeapId) { 2295228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackHeapFree++; 2296228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2297228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2298228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: exit", __FUNCTION__); 2299228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 2300228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2301228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() { 2302228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ATRACE_CALL(); 2303228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res; 2304228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala sp<Camera2Heap> captureHeap; 2305228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId); 2306228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2307228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala { 2308228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 2309228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CpuConsumer::LockedBuffer imgBuffer; 2310d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2311d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mCaptureConsumer->lockNextBuffer(&imgBuffer); 2312d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 2313d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)", 2314d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 2315d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 2316d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2317d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2318228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // TODO: Signal errors here upstream 2319228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (k.mParameters.state != STILL_CAPTURE && 2320228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state != VIDEO_SNAPSHOT) { 2321228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly!", 2322228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId); 2323228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 2324228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return; 2325228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2326228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2327d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) { 2328d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected format for still image: " 2329d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%x, expected %x", __FUNCTION__, mCameraId, 2330d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala imgBuffer.format, 2331d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala HAL_PIXEL_FORMAT_BLOB); 2332d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 2333d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return; 2334d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2335d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2336d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Optimize this to avoid memcopy 23379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala void* captureMemory = mCaptureHeap->mHeap->getBase(); 23389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size = mCaptureHeap->mHeap->getSize(); 2339d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala memcpy(captureMemory, imgBuffer.data, size); 2340d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2341d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->unlockBuffer(imgBuffer); 2342d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2343228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (k.mParameters.state) { 2344d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case STILL_CAPTURE: 2345228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = STOPPED; 2346d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 2347d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala case VIDEO_SNAPSHOT: 2348228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = RECORD; 2349d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 2350d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 2351d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__, 2352228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCameraId, k.mParameters.state); 2353d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 2354d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 23558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2356228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala captureHeap = mCaptureHeap; 2357d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2358228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // Call outside parameter locks to allow re-entrancy from notification 2359228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala Mutex::Autolock iccl(mICameraClientLock); 2360228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (mCameraClient != 0) { 2361228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 2362228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala captureHeap->mBuffers[0], NULL); 23639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 23649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 23659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 23669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() { 23679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ATRACE_CALL(); 23689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 2369228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala sp<Camera2Heap> recordingHeap; 23709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t heapIdx = 0; 23719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala nsecs_t timestamp; 23729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala { 2373228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala LockedParameters::Key k(mParameters); 23749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 237530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala BufferItemConsumer::BufferItem imgBuffer; 237630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala res = mRecordingConsumer->acquireBuffer(&imgBuffer); 23779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 23789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)", 23799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 23809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 23819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 238230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala timestamp = imgBuffer.mTimestamp; 23839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2384228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mRecordingFrameCount++; 2385228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount); 2386228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2387228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // TODO: Signal errors here upstream 2388228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (k.mParameters.state != RECORD && 2389228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state != VIDEO_SNAPSHOT) { 2390228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Camera %d: Discarding recording image buffers received after " 2391228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala "recording done", 2392228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId); 239330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala mRecordingConsumer->releaseBuffer(imgBuffer); 23949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 23959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 2396898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala 239778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala if (mRecordingHeap == 0) { 239878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala const size_t bufferSize = 4 + sizeof(buffer_handle_t); 23999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Creating recording heap with %d buffers of " 24009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "size %d bytes", __FUNCTION__, mCameraId, 2401983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingHeapCount, bufferSize); 24029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2403983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount, 24049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "Camera2Client::RecordingHeap"); 24059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingHeap->mHeap->getSize() == 0) { 24069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for recording", 24079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 240830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala mRecordingConsumer->releaseBuffer(imgBuffer); 24099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 24109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 241130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala for (size_t i = 0; i < mRecordingBuffers.size(); i++) { 241230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala if (mRecordingBuffers[i].mBuf != 241330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala BufferItemConsumer::INVALID_BUFFER_SLOT) { 241430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala ALOGE("%s: Camera %d: Non-empty recording buffers list!", 241530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala __FUNCTION__, mCameraId); 241630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala } 241730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala } 241830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala mRecordingBuffers.clear(); 241930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala mRecordingBuffers.setCapacity(mRecordingHeapCount); 242030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala mRecordingBuffers.insertAt(0, mRecordingHeapCount); 242130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 24229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapHead = 0; 2423983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingHeapFree = mRecordingHeapCount; 24249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 24259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 24269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if ( mRecordingHeapFree == 0) { 24279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: No free recording buffers, dropping frame", 24289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId); 242930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala mRecordingConsumer->releaseBuffer(imgBuffer); 24309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 24319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 2432228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 24339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala heapIdx = mRecordingHeapHead; 2434983cf231ab2d176a14595cdae46ff1b0c239af47James Dong mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount; 24359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeapFree--; 24369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 24379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Timestamp %lld", 24389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, timestamp); 24399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 24409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ssize_t offset; 24419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala size_t size; 24429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<IMemoryHeap> heap = 24439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset, 24449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &size); 24459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 244678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint8_t *data = (uint8_t*)heap->getBase() + offset; 244778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint32_t type = kMetadataBufferTypeGrallocSource; 244830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala *((uint32_t*)data) = type; 244930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle; 245078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGV("%s: Camera %d: Sending out buffer_handle_t %p", 245130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle); 245230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala mRecordingBuffers.replaceAt(imgBuffer, heapIdx); 2453228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala recordingHeap = mRecordingHeap; 24549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 2455228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 2456228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // Call outside locked parameters to allow re-entrancy from notification 2457228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala Mutex::Autolock iccl(mICameraClientLock); 2458228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (mCameraClient != 0) { 2459228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCameraClient->dataCallbackTimestamp(timestamp, 24609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala CAMERA_MSG_VIDEO_FRAME, 2461228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala recordingHeap->mBuffers[heapIdx]); 2462d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 2463d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 2464d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 2465cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_ro_entry_t Camera2Client::staticInfo(uint32_t tag, 2466cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t minCount, size_t maxCount) const { 24673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala status_t res; 2468cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t entry = mDevice->info().find(tag); 2469cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 2470cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( entry.count == 0 )) { 24713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 24723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 24733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 24743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 24753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2476cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x)", 2477cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala tagSection, tagName, tag); 24783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } else if (CC_UNLIKELY( 24793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 24803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 24813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 24823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 24833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 24843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 24853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 24863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "Expected between %d and %d values, but got %d values", 24873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 24883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } 24893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 24903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return entry; 24913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala} 24923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 24933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */ 24943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 24958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Client::buildDeviceInfo() { 24968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (mDeviceInfo != NULL) { 24978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala delete mDeviceInfo; 24988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 24998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala DeviceInfo *deviceInfo = new DeviceInfo; 25008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mDeviceInfo = deviceInfo; 25018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2502cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t activeArraySize = 25038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2); 25048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (!activeArraySize.count) return NO_INIT; 25058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala deviceInfo->arrayWidth = activeArraySize.data.i32[0]; 25068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala deviceInfo->arrayHeight = activeArraySize.data.i32[1]; 25078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2508cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableFaceDetectModes = 25098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala staticInfo(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES); 25108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (!availableFaceDetectModes.count) return NO_INIT; 25118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 25128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala deviceInfo->bestFaceDetectMode = 25138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ANDROID_STATS_FACE_DETECTION_OFF; 25148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) { 25158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala switch (availableFaceDetectModes.data.u8[i]) { 25168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala case ANDROID_STATS_FACE_DETECTION_OFF: 25178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala break; 25188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala case ANDROID_STATS_FACE_DETECTION_SIMPLE: 25198ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (deviceInfo->bestFaceDetectMode != 25208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ANDROID_STATS_FACE_DETECTION_FULL) { 25218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala deviceInfo->bestFaceDetectMode = 25228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ANDROID_STATS_FACE_DETECTION_SIMPLE; 25238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 25248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala break; 25258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala case ANDROID_STATS_FACE_DETECTION_FULL: 25268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala deviceInfo->bestFaceDetectMode = 25278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ANDROID_STATS_FACE_DETECTION_FULL; 25288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala break; 25298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala default: 25308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown face detect mode %d:", 25318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, 25328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala availableFaceDetectModes.data.u8[i]); 25338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return NO_INIT; 25348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 25358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 25368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 2537cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t maxFacesDetected = 25388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1); 25398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (!maxFacesDetected.count) return NO_INIT; 25408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 25418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala deviceInfo->maxFaces = maxFacesDetected.data.i32[0]; 25428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 25438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return OK; 25448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 2545f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2546f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() { 2547a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 2548836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala LockedParameters::Key k(mParameters); 2549ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 2550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 25513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters params; 2552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2553cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableProcessedSizes = 25543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2); 25553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableProcessedSizes.count) return NO_INIT; 2556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick more intelligently 2558836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth = availableProcessedSizes.data.i32[0]; 2559836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewHeight = availableProcessedSizes.data.i32[1]; 2560836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoWidth = k.mParameters.previewWidth; 2561836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.videoHeight = k.mParameters.previewHeight; 25623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2563836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setPreviewSize(k.mParameters.previewWidth, k.mParameters.previewHeight); 2564836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setVideoSize(k.mParameters.videoWidth, k.mParameters.videoHeight); 25653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 25663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8::format("%dx%d", 2567836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewWidth, k.mParameters.previewHeight)); 2568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewSizes; 2570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableProcessedSizes.count; i += 2) { 2571f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewSizes += ","; 2572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes += String8::format("%dx%d", 2573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableProcessedSizes.data.i32[i], 2574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableProcessedSizes.data.i32[i+1]); 2575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 25763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 2577f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes); 25783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 2579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewSizes); 2580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2582cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableFpsRanges = 25833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 25843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableFpsRanges.count) return NO_INIT; 2585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2586836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0]; 2587836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1]; 2588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 25893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 25903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8::format("%d,%d", 2591836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0], 2592836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[1])); 2593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFpsRange; 2596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 2597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewFpsRange += ","; 2598f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFpsRange += String8::format("(%d,%d)", 2599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i], 2600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i+1]); 2601f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 26023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 2603f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFpsRange); 2604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2606836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 26073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FORMAT, 2608836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala formatEnumToString(k.mParameters.previewFormat)); // NV21 26093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2610836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewTransform = degToTransform(0, 2611c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 2612c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 2613cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableFormats = 26143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 2615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2616f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2617f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFormats; 2618f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2619f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFormats.count; i++) { 2620f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedPreviewFormats += ","; 2621f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2622f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableFormats.data.i32[i]) { 2623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: 2624bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 2625bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422SP; 2626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: 2628bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 2629bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 2630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: 2632bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 2633bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422I; 2634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: 2636bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 2637bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 2638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 2640bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedPreviewFormats += 2641bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGB565; 2642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 264311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 264411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala supportedPreviewFormats += 264511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGBA8888; 264611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala break; 264711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 2648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 264911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 2650f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 265211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala 2653f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown preview format: %x", 2655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableFormats.data.i32[i]); 2656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 26603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 2661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFormats); 2662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 2665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // still have to do something sane for them 2666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 26673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 2668836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.previewFpsRange[0]); 2669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPreviewFrameRates; 2672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 2673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPreviewFrameRates += ","; 2674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 2675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableFpsRanges.data.i32[i]); 2676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 26773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 2678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPreviewFrameRates); 2679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2681cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegSizes = 26823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 26833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableJpegSizes.count) return NO_INIT; 2684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick maximum 2686836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureWidth = availableJpegSizes.data.i32[0]; 2687836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight = availableJpegSizes.data.i32[1]; 2688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2689836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.setPictureSize(k.mParameters.pictureWidth, 2690836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.pictureHeight); 2691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedPictureSizes; 2694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableJpegSizes.count; i += 2) { 2695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 2696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 2697f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegSizes.data.i32[i], 2698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegSizes.data.i32[i+1]); 2699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 27003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 2701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedPictureSizes); 2702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 27043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 27053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 27063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 2707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2708cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbnailSizes = 27093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2); 27103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 2711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // TODO: Pick default thumbnail size sensibly 2713836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0]; 2714836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1]; 2715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 27163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 2717836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[0]); 27183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 2719836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbSize[1]); 2720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedJpegThumbSizes; 2723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 2724f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 2725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 2726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 2727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 2728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 27293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 2730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedJpegThumbSizes); 2731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2733836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality = 90; 27343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 2735836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegThumbQuality); 2736836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality = 90; 27373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 2738836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegQuality); 2739836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegRotation = 0; 27403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 2741836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.jpegRotation); 27423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2743836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsEnabled = false; 2744836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.gpsProcessingMethod = "unknown"; 27453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 27463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2747836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO; 27483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 27493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 27503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2751cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableWhiteBalanceModes = 27523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 2753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedWhiteBalance; 2755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 2757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 2758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 2760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_AUTO: 2761bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2762bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 2763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_INCANDESCENT: 2765bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2766bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 2767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_FLUORESCENT: 2769bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2770bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 2771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 2773bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2774bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 2775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2776f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_DAYLIGHT: 2777bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2778bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 2779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2780f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 2781bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2782bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 2783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2784f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_TWILIGHT: 2785bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2786bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 2787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_SHADE: 2789bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedWhiteBalance += 2790bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 2791f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Skipping values not mappable to v1 API 2793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AWB_OFF: 2794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2795f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 2798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, 2799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 2800f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2801f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2802f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 28043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 2805f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedWhiteBalance); 2806f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2808836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF; 28093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 28103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::EFFECT_NONE); 28113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2812cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableEffects = 28133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 28143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableEffects.count) return NO_INIT; 2815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedEffects; 2817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 2819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedEffects += ","; 2820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 2822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_OFF: 2823bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2824bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_NONE; 2825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_MONO: 2827bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2828bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_MONO; 2829bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala break; 2830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_NEGATIVE: 2831bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2832bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 2833f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2834f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SOLARIZE: 2835bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2836bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 2837f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2838f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SEPIA: 2839bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2840bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_SEPIA; 2841f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2842f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_POSTERIZE: 2843bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2844bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 2845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2846f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_WHITEBOARD: 2847bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2848bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 2849f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2850f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_BLACKBOARD: 2851bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2852bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 2853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_AQUA: 2855bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedEffects += 2856bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::EFFECT_AQUA; 2857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 2860f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableEffects.data.u8[i]); 2861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 28653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 2866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2868836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 28693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 28703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 28713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2872cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableAntibandingModes = 28733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 28743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAntibandingModes.count) return NO_INIT; 2875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2876f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 supportedAntibanding; 2877f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 2878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 2879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 2880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2881f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 2882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_OFF: 2883bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2884bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 2885f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_50HZ: 2887bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2888bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 2889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_60HZ: 2891bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2892bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 2893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_AUTO: 2895bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedAntibanding += 2896bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 2897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2899f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 2900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, 2901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 2902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2903f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2904f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2905f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 29063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 2907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedAntibanding); 2908f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2910836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.sceneMode = ANDROID_CONTROL_OFF; 29113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 29123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 29133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 2914cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 29153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 29163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableSceneModes.count) return NO_INIT; 2917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 2918bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 2919f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = true; 2920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool noSceneModes = false; 2921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 2922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 2923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 2924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 2925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala noSceneModes = true; 2927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 2929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Not in old API 2930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2931f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 2933bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2934bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 2935f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 2937bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2938bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 2939f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 2941bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2942bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 2943f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 2945bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2946bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 2947f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 2949bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2950bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 2951f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 2953bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2954bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 2955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 2957bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2958bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 2959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2960f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 2961bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2962bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 2963f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2964f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 2965bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2966bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 2967f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2968f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 2969bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2970bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 2971f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2972f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 2973bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2974bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 2975f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2976f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 2977bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2978bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 2979f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2980f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 2981bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2982bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 2983f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2984f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 2985bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2986bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 2987f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2988f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 2989bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedSceneModes += 2990bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 2991f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2992f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 2993f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 2994bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala __FUNCTION__, mCameraId, 2995bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala availableSceneModes.data.u8[i]); 2996f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 2997f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 2998f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 2999f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3000f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (!noSceneModes) { 30013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 3002f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedSceneModes); 3003f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3004f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3005f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3006cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 30073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 30083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!flashAvailable.count) return NO_INIT; 3009f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3010cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 30113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 30123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAeModes.count) return NO_INIT; 3013f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3014f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (flashAvailable.data.u8[0]) { 3015836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = Parameters::FLASH_MODE_AUTO; 30163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 30173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_AUTO); 30183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 30193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 30203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 30213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 30223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 30233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 3024f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 3025f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (availableAeModes.data.u8[i] == 3026f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) { 30273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 30283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 3029f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 3030f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3031f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 30323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 3033f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedFlashModes); 30343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } else { 3035836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.flashMode = Parameters::FLASH_MODE_OFF; 30363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 30373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 30383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 30393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 3040f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3041f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3042cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 30433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1); 30443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!minFocusDistance.count) return NO_INIT; 30453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 3046cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableAfModes = 30473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 30483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableAfModes.count) return NO_INIT; 30493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 3050f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 3051f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // Fixed-focus lens 3052836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = Parameters::FOCUS_MODE_FIXED; 30533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 30543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 30553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 30563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 3057f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 3058836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 30593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 30603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 3061174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY); 3062f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = true; 3063bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 3064f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 3065f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 3066f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 3067f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 3068f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_AUTO: 3069bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 3070bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 3071f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 3072f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_MACRO: 3073bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 3074bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 3075f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 3076f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 3077bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 3078bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 3079f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 3080f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 3081bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 3082bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 3083f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 3084f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_EDOF: 3085bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala supportedFocusModes += 3086bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 3087f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 3088bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala // Not supported in old API 3089f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala case ANDROID_CONTROL_AF_OFF: 3090f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 3091f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 3092f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala default: 3093f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 3094f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, availableAfModes.data.u8[i]); 3095f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = false; 3096f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala break; 3097f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3098f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 30993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 3100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala supportedFocusModes); 3101f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3103cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t max3aRegions = 31043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 31053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!max3aRegions.count) return NO_INIT; 3106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 31073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 3108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala max3aRegions.data.i32[0]); 31093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 3110f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "(0,0,0,0,0)"); 3111836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas.clear(); 3112836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0)); 31133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 3114cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 31153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS); 31163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 3117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3118f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float minFocalLength = availableFocalLengths.data.f[0]; 31193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 3120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3121cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t sensorSize = 31223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2); 31233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!sensorSize.count) return NO_INIT; 3124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // The fields of view here assume infinity focus, maximum wide angle 3126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float horizFov = 180 / M_PI * 3127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength)); 3128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float vertFov = 180 / M_PI * 3129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength)); 31303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 31313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 3132f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3133836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation = 0; 31343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 3135836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.exposureCompensation); 3136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3137cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 31383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2); 31393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 31403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 31413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 3142f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 31433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 3144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 3145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3146cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationStep = 31473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1); 31483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 31493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 31503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 3151d6f8e08a9ca7f2fe41717acd351426a7ecb0c175Eino-Ville Talvala (float)exposureCompensationStep.data.r[0].numerator / 3152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 3153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoExposureLock = false; 31553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 31563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 31573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 31583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 3159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3160836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.autoWhiteBalanceLock = false; 31613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 31623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 31633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 31643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 3165f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3166836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 31673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 3168f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala max3aRegions.data.i32[0]); 31693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 3170f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "(0,0,0,0,0)"); 3171f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3172836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.zoom = 0; 3173836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.set(CameraParameters::KEY_ZOOM, k.mParameters.zoom); 31743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 3175f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3176cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t maxDigitalZoom = 31773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1); 31783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 3179f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala { 3181f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala String8 zoomRatios; 3182f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float zoom = 1.f; 3183f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 31846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala (NUM_ZOOM_STEPS-1); 3185f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool addComma = false; 31866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 3187f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (addComma) zoomRatios += ","; 3188f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala addComma = true; 3189f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 3190f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala zoom += zoomIncrement; 3191f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 31923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 3193f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3194f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 31953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 31963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 31973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 31983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 3199f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 32003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 3201f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "Infinity,Infinity,Infinity"); 3202f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 32033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 32048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mDeviceInfo->maxFaces); 32053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 3206f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 0); 3207f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 32083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 320978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 3210f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 32113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 32123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 3213f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 32143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 32153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 3216f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 32173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 32183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 32193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 3220cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 32213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 32223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala if (!availableVideoStabilizationModes.count) return NO_INIT; 3223f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3224f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 32253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 32263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::TRUE); 3227f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 32283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 32293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala CameraParameters::FALSE); 3230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 323236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Set up initial state for non-Camera.Parameters state variables 323336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 3234836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.storeMetadataInBuffers = true; 323536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala k.mParameters.playShutterSound = true; 32368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala k.mParameters.enableFaceDetect = false; 3237228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 3238228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.enableFocusMoveMessages = false; 3239174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.afTriggerCounter = 0; 3240174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala k.mParameters.currentAfTriggerId = -1; 324178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 3242228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.previewCallbackFlags = 0; 3243228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 3244228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala k.mParameters.state = STOPPED; 3245228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 3246836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala k.mParameters.paramsFlattened = params.flatten(); 32473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 3248f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 3249f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 325061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 32518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Client::updateRequests(const Parameters ¶ms) { 32528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 32538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 32548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala res = updatePreviewRequest(params); 32558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 32568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 32578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 32588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 32598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 32608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala res = updateCaptureRequest(params); 32618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 32628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)", 32638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 32648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 32658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 32668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 32678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala res = updateRecordingRequest(params); 32688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 32698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 32708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 32718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 32728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 32738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 3274228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (params.state == PREVIEW) { 32758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala res = mDevice->setStreamingRequest(mPreviewRequest); 32768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 32778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 32788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 32798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 32808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 3281228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } else if (params.state == RECORD || params.state == VIDEO_SNAPSHOT) { 32828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala res = mDevice->setStreamingRequest(mRecordingRequest); 32838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 32848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 32858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 32868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 32878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 32888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 32898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 32908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 32918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 3292836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters ¶ms) { 3293be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 3294be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 3295836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 3296be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 3297be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Check if stream parameters have to change 3298be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint32_t currentWidth, currentHeight; 3299be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->getStreamInfo(mPreviewStreamId, 3300be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ¤tWidth, ¤tHeight, 0); 3301be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 3302be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error querying preview stream info: " 3303be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 3304be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 3305be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3306836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.previewWidth || 3307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.previewHeight) { 33089e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d", 33099e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId, currentWidth, currentHeight, 3310836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth, params.previewHeight); 3311be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->waitUntilDrained(); 3312be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 3313be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Error waiting for preview to drain: " 3314be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 3315be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 3316be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3317be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->deleteStream(mPreviewStreamId); 3318be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 3319be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 3320be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "for preview: %s (%d)", __FUNCTION__, mCameraId, 3321be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 3322be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 3323be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3324be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mPreviewStreamId = NO_STREAM; 3325be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3326be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3327be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3328be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mPreviewStreamId == NO_STREAM) { 3329be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->createStream(mPreviewWindow, 3330836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth, params.previewHeight, 3331be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, 3332be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mPreviewStreamId); 3333be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 3334be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)", 3335be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 3336be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 3337be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3338be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3339be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3340c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = mDevice->setStreamTransform(mPreviewStreamId, 3341836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewTransform); 3342c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (res != OK) { 3343c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview stream transform: " 3344c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 3345c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return res; 3346c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 3347c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 3348be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 3349be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 3350be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3351836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters ¶ms) { 3352a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 33536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 3354cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mPreviewRequest.entryCount() == 0) { 33556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 33566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &mPreviewRequest); 33576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 33586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default preview request: " 33596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 33606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 33616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 33626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 3363be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3364cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = updateRequestCommon(&mPreviewRequest, params); 3365be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 3366be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of preview " 3367be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 3368be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 3369be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 3370be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3371be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 33726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 33736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 33746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 3375228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::updateCallbackStream(const Parameters ¶ms) { 3376228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res; 3377228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 3378228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (mCallbackConsumer == 0) { 3379228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // Create CPU buffer queue endpoint 3380228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer = new CpuConsumer(kCallbackHeapCount); 3381228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackWaiter = new CallbackWaiter(this); 3382228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer->setFrameAvailableListener(mCallbackWaiter); 3383228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer->setName(String8("Camera2Client::CallbackConsumer")); 3384228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackWindow = new SurfaceTextureClient( 3385228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackConsumer->getProducerInterface()); 3386228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 3387228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 3388228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (mCallbackStreamId != NO_STREAM) { 3389228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // Check if stream parameters have to change 3390228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint32_t currentWidth, currentHeight, currentFormat; 3391228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = mDevice->getStreamInfo(mCallbackStreamId, 3392228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ¤tWidth, ¤tHeight, ¤tFormat); 3393228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 3394228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying callback output stream info: " 3395228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 3396228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 3397228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 3398228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (currentWidth != (uint32_t)params.previewWidth || 3399228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala currentHeight != (uint32_t)params.previewHeight || 3400228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala currentFormat != (uint32_t)params.previewFormat) { 3401228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // Since size should only change while preview is not running, 3402228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // assuming that all existing use of old callback stream is 3403228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // completed. 3404228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = mDevice->deleteStream(mCallbackStreamId); 3405228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 3406228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 3407228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala "for callbacks: %s (%d)", __FUNCTION__, mCameraId, 3408228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala strerror(-res), res); 3409228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 3410228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 3411228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mCallbackStreamId = NO_STREAM; 3412228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 3413228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 3414228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 3415228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (mCallbackStreamId == NO_STREAM) { 3416228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("Creating callback stream: %d %d format 0x%x", 3417228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewWidth, params.previewHeight, 3418228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewFormat); 3419228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = mDevice->createStream(mCallbackWindow, 3420228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewWidth, params.previewHeight, 3421228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewFormat, 0, &mCallbackStreamId); 3422228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 3423228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for callbacks: " 3424228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 3425228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 3426228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 3427228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 3428228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 3429228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return OK; 3430228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 3431228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 3432228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 3433836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureStream(const Parameters ¶ms) { 3434be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 3435d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 3436d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Find out buffer size for JPEG 3437cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t maxJpegSize = 3438d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala staticInfo(ANDROID_JPEG_MAX_SIZE); 3439d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (maxJpegSize.count == 0) { 3440d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!", 3441d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 3442d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return INVALID_OPERATION; 3443d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 3444d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 3445d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mCaptureConsumer == 0) { 3446d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Create CPU buffer queue endpoint 3447d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer = new CpuConsumer(1); 3448d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this)); 3449d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer")); 3450d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureWindow = new SurfaceTextureClient( 3451d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureConsumer->getProducerInterface()); 3452d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Create memory for API consumption 34539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1, 34549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "Camera2Client::CaptureHeap"); 34559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mCaptureHeap->mHeap->getSize() == 0) { 3456d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to allocate memory for capture", 3457d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 3458d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return NO_MEMORY; 3459d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 3460d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 3461d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 3462be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mCaptureStreamId != NO_STREAM) { 3463d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // Check if stream parameters have to change 3464d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t currentWidth, currentHeight; 3465d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->getStreamInfo(mCaptureStreamId, 3466d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ¤tWidth, ¤tHeight, 0); 3467d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 3468d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying capture output stream info: " 3469d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 3470d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 3471d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 3472836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.pictureWidth || 3473836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.pictureHeight) { 3474d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->deleteStream(mCaptureStreamId); 3475d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 3476d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 3477d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala "for capture: %s (%d)", __FUNCTION__, mCameraId, 3478d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala strerror(-res), res); 3479d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 3480d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 3481d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mCaptureStreamId = NO_STREAM; 3482d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 3483d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 3484be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3485be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (mCaptureStreamId == NO_STREAM) { 3486be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Create stream for HAL production 3487be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala res = mDevice->createStream(mCaptureWindow, 3488836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.pictureWidth, params.pictureHeight, 3489be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0], 3490be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &mCaptureStreamId); 3491be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 3492be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for capture: " 3493be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 3494be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 3495be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3496be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3497be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3498d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 3499d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 3500be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3501836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest(const Parameters ¶ms) { 3502d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 3503d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 3504cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mCaptureRequest.entryCount() == 0) { 3505d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE, 3506d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala &mCaptureRequest); 3507d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 3508d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 3509d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 3510d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 3511d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 3512d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 3513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3514cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = updateRequestCommon(&mCaptureRequest, params); 3515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 3516be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 3517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 3518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala strerror(-res), res); 3519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 3520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3521be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3522cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE, 3523836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.jpegThumbSize, 2); 3524be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3525cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY, 3526836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegThumbQuality, 1); 3527be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3528cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_QUALITY, 3529836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegQuality, 1); 3530be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3531cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update( 3532be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_ORIENTATION, 3533836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.jpegRotation, 1); 3534be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3535be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3536836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.gpsEnabled) { 3537cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update( 3538be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 3539836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.gpsCoordinates, 3); 3540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3541cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update( 3542be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 3543836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.gpsTimestamp, 1); 3544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3545cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.update( 3546be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 3547cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala params.gpsProcessingMethod); 3548be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3549be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else { 3550cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES); 3551be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3552cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP); 3553be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3554cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD); 3555be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3556be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3557be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3558d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 3559d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 3560d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 3561836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters ¶ms) { 35629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ATRACE_CALL(); 35639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 3564cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mRecordingRequest.entryCount() == 0) { 35659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD, 35669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala &mRecordingRequest); 35679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 35689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default recording request:" 35699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 35709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 35719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 35729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 35739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3574cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = updateRequestCommon(&mRecordingRequest, params); 35759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 35769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of recording " 35779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "request: %s (%d)", __FUNCTION__, mCameraId, 35789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 35799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 35809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 35819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 35829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 35839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 35849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3585836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters ¶ms) { 35869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 35879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 35889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingConsumer == 0) { 3589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // Create CPU buffer queue endpoint. We need one more buffer here so that we can 3590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // always acquire and free a buffer when the heap is full; otherwise the consumer 3591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // will have buffers in flight we'll never clear out. 359230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala mRecordingConsumer = new BufferItemConsumer( 359330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala GRALLOC_USAGE_HW_VIDEO_ENCODER, 359430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala mRecordingHeapCount + 1, 359530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala true); 35969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this)); 35979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer")); 35989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingWindow = new SurfaceTextureClient( 35999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingConsumer->getProducerInterface()); 36009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Allocate memory later, since we don't know buffer size until receipt 36019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 36029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 36039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 36049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Check if stream parameters have to change 36059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint32_t currentWidth, currentHeight; 36069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->getStreamInfo(mRecordingStreamId, 36079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ¤tWidth, ¤tHeight, 0); 36089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 36099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Error querying recording output stream info: " 36109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 36119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 36129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 3613836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (currentWidth != (uint32_t)params.videoWidth || 3614836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala currentHeight != (uint32_t)params.videoHeight) { 36159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // TODO: Should wait to be sure previous recording has finished 36169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->deleteStream(mRecordingStreamId); 36179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 36189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 36199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "for recording: %s (%d)", __FUNCTION__, mCameraId, 36209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala strerror(-res), res); 36219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 36229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 36239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mRecordingStreamId = NO_STREAM; 36249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 36259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 36269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 36279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mRecordingStreamId == NO_STREAM) { 3628228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala mRecordingFrameCount = 0; 36299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala res = mDevice->createStream(mRecordingWindow, 3630836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.videoWidth, params.videoHeight, 363178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId); 36329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 36339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for recording: " 36349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 36359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 36369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 36379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 36389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 36399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 36409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala} 36419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 3642cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(CameraMetadata *request, 3643836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const Parameters ¶ms) { 3644be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ATRACE_CALL(); 3645be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala status_t res; 3646cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 3647cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala params.previewFpsRange, 2); 3648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3650836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint8_t wbMode = params.autoWhiteBalanceLock ? 3651cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala (uint8_t)ANDROID_CONTROL_AWB_LOCKED : params.wbMode; 3652cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_MODE, 3653cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala &wbMode, 1); 3654be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3655cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_EFFECT_MODE, 3656cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ¶ms.effectMode, 1); 3657be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3658cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, 3659836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.antibandingMode, 1); 3660be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3661be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3662be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t controlMode = 3663836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ? 3664be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE; 3665cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_MODE, 3666cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala &controlMode, 1); 3667be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3668be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) { 3669cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_SCENE_MODE, 3670836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.sceneMode, 1); 3671be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3672be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3673be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3674be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t flashMode = ANDROID_FLASH_OFF; 3675be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t aeMode; 3676836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (params.flashMode) { 3677be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_OFF: 3678be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON; break; 3679be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 3680be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break; 3681be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_ON: 3682be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break; 3683be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 3684be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON; 3685be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala flashMode = ANDROID_FLASH_TORCH; 3686be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 3687be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 3688be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break; 3689be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala default: 3690be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 3691836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala mCameraId, params.flashMode); 3692be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return BAD_VALUE; 3693be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3694836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED; 3695be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3696cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_FLASH_MODE, 3697cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala &flashMode, 1); 3698be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3699cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_MODE, 3700cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala &aeMode, 1); 3701be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3702be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3703be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float focusDistance = 0; // infinity focus in diopters 3704be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala uint8_t focusMode; 3705836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (params.focusMode) { 3706be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 3707be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 3708be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 3709be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 3710be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 3711836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusMode = params.focusMode; 3712be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 3713be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 3714be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 3715be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala focusMode = ANDROID_CONTROL_AF_OFF; 3716be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala break; 3717be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala default: 3718be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 3719836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala mCameraId, params.focusMode); 3720be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return BAD_VALUE; 3721be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3722cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_LENS_FOCUS_DISTANCE, 3723cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala &focusDistance, 1); 3724be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3725cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_MODE, 3726cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala &focusMode, 1); 3727be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3728be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3729836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala size_t focusingAreasSize = params.focusingAreas.size() * 5; 3730be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t *focusingAreas = new int32_t[focusingAreasSize]; 3731be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala for (size_t i = 0; i < focusingAreasSize; i += 5) { 3732836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 0] = params.focusingAreas[i].left; 3733836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 1] = params.focusingAreas[i].top; 3734836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 2] = params.focusingAreas[i].right; 3735836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 3] = params.focusingAreas[i].bottom; 3736836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala focusingAreas[i + 4] = params.focusingAreas[i].weight; 3737be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3738cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_REGIONS, 3739cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala focusingAreas,focusingAreasSize); 3740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala delete[] focusingAreas; 3742be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3743cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_EXP_COMPENSATION, 3744836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ¶ms.exposureCompensation, 1); 3745be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3746be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3747836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala size_t meteringAreasSize = params.meteringAreas.size() * 5; 3748be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t *meteringAreas = new int32_t[meteringAreasSize]; 3749be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala for (size_t i = 0; i < meteringAreasSize; i += 5) { 3750836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 0] = params.meteringAreas[i].left; 3751836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 1] = params.meteringAreas[i].top; 3752836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 2] = params.meteringAreas[i].right; 3753836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 3] = params.meteringAreas[i].bottom; 3754836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala meteringAreas[i + 4] = params.meteringAreas[i].weight; 3755be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 3756cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_REGIONS, 3757cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala meteringAreas, meteringAreasSize); 3758be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3759be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3760cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_REGIONS, 3761cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala meteringAreas, meteringAreasSize); 3762be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3763be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala delete[] meteringAreas; 3764be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3765be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // Need to convert zoom index into a crop rectangle. The rectangle is 3766be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // chosen to maximize its area on the sensor 3767be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3768cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry_t maxDigitalZoom = 3769be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM); 3770be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 3771be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala (NUM_ZOOM_STEPS-1); 3772836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala float zoomRatio = 1 + zoomIncrement * params.zoom; 3773be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3774be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala float zoomLeft, zoomTop, zoomWidth, zoomHeight; 3775836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (params.previewWidth >= params.previewHeight) { 37768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala zoomWidth = mDeviceInfo->arrayWidth / zoomRatio; 3777be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomHeight = zoomWidth * 3778836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewHeight / params.previewWidth; 3779be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } else { 37808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala zoomHeight = mDeviceInfo->arrayHeight / zoomRatio; 3781be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala zoomWidth = zoomHeight * 3782836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala params.previewWidth / params.previewHeight; 3783be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 37848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala zoomLeft = (mDeviceInfo->arrayWidth - zoomWidth) / 2; 37858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala zoomTop = (mDeviceInfo->arrayHeight - zoomHeight) / 2; 3786be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3787be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth }; 3788cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_SCALER_CROP_REGION, 3789cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala cropRegion, 3); 3790be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3791be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3792be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala // TODO: Decide how to map recordingHint, or whether just to ignore it 3793be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 3794836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint8_t vstabMode = params.videoStabilization ? 3795be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_ON : 3796be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; 3797cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 3798be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala &vstabMode, 1); 3799be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) return res; 3800be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 38018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala uint8_t faceDetectMode = params.enableFaceDetect ? 38028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mDeviceInfo->bestFaceDetectMode : 38038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala (uint8_t)ANDROID_STATS_FACE_DETECTION_OFF; 3804cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = request->update(ANDROID_STATS_FACE_DETECT_MODE, 38058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala &faceDetectMode, 1); 38068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) return res; 38078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 3808be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return OK; 3809be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala} 3810be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 38118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalaint Camera2Client::arrayXToNormalized(int width) const { 38128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return width * 2000 / (mDeviceInfo->arrayWidth - 1) - 1000; 38138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 38148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 38158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalaint Camera2Client::arrayYToNormalized(int height) const { 38168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return height * 2000 / (mDeviceInfo->arrayHeight - 1) - 1000; 38178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 38188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 38196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) { 38206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 38216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 38226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 38236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 38246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 38256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 38266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 38276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 38286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_YV12 : // YV12 38296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 38306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RGB_565 : // RGB565 38316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 38326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 38336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 38346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 38356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 38366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 38376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 38383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) { 38393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala const char *fmt; 38403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala switch(format) { 38413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 38423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 38433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 38443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 38453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 38463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 38473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 38483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 38493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 38503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 38513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 38523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 38533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 38543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 38553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 38563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 38573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 38583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 38593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 38603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 38613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 38623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 38633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala default: 38643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 38653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala __FUNCTION__, format); 38663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala fmt = NULL; 38673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala break; 38683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala } 38693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala return fmt; 38703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala} 38716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 38726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) { 38736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 38746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 38756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_AUTO : 38766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 38776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_INCANDESCENT : 38786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 38796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_FLUORESCENT : 38806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 38816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_WARM_FLUORESCENT : 38826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 38836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_DAYLIGHT : 38846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 38856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT : 38866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 38876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_TWILIGHT : 38886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 38896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AWB_SHADE : 38906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 38916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 38926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 38936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) { 38946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 38956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 38966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_OFF : 38976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 38986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_MONO : 38996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 39006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_NEGATIVE : 39016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 39026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SOLARIZE : 39036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 39046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SEPIA : 39056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 39066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_POSTERIZE : 39076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 39086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_WHITEBOARD : 39096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 39106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_BLACKBOARD : 39116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 39126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_EFFECT_AQUA : 39136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 39146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 39156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 39166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) { 39176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 39186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 39196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_AUTO : 39206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 39216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_OFF : 39226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 39236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_50HZ : 39246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 39256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_60HZ : 39266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 39276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 39286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 39296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) { 39306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 39316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 39326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 39336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 39346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 39356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 39366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 39376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 39386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 39396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 39406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 39416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 39426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 39436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 39446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 39456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 39466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 39476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 39486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 39496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 39506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 39516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 39526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 39536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 39546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 39556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 39566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 39576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 39586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 39596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 39606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 39616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 39626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 39636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala -1; 39646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 39656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 39666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum( 39676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *flashMode) { 39686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 39696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 39706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 39716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 39726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 39736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 39746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_ON : 39756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 39766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 39776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 39786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 39796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 39806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 39816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 39826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum( 39836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char *focusMode) { 39846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return 39856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 39866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 39876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 39886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 39896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 39906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 39916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 39926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 39936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 39946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 39956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 39966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 39976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 39986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 39996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 40006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 40016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 40026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr, 40036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala Vector<Parameters::Area> *areas) { 40046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 40056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->clear(); 40066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areasCStr == NULL) { 40076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 40086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->push(); 40096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 40106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 40116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala String8 areasStr(areasCStr); 40126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 40136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala while (areaStart != 0) { 40146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 40156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala char *numEnd; 40166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala int vals[NUM_FIELDS]; 40176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 40186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala errno = 0; 40196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 40206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 40216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala area = numEnd + 1; 40226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 40236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas->push(Parameters::Area( 40246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 40256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 40266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 40276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 40286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 40296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 40306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas, 40316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala size_t maxRegions) { 40326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Definition of valid area can be found in 40336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // include/camera/CameraParameters.h 40346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 40356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() == 1) { 40366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas[0].left == 0 && 40376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].top == 0 && 40386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].right == 0 && 40396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].bottom == 0 && 40406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala areas[0].weight == 0) { 40416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 40426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 40436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 40446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 40456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (areas.size() > maxRegions) { 40466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala ALOGE("%s: Too many areas requested: %d", 40476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala __FUNCTION__, areas.size()); 40486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return BAD_VALUE; 40496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 40506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 40516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 40526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala a != areas.end(); a++) { 40536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 40546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 40556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 40566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 40576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 40586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 40596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 40606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala } 40616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return OK; 40626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 40636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 40646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) { 40656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala return !boolStr ? false : 40666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 40676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala false; 40686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala} 40696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 4070c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalaint Camera2Client::degToTransform(int degrees, bool mirror) { 4071c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (!mirror) { 4072c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (degrees == 0) return 0; 4073c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 4074c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 4075c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 4076c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 4077c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 4078c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 4079c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 4080c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 4081c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 4082c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 4083c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 4084c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 4085c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 4086c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 4087c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 4088c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return -1; 4089c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 40906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 4091228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height, 4092228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala int format, int stride) { 4093228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (format) { 4094228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 4095228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 4096228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 4097228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 3 / 2; 4098228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 4099228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 4100228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: { // YV12 4101228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t ySize = stride * height; 4102228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t uvStride = (stride / 2 + 0xF) & ~0x10; 4103228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t uvSize = uvStride * height / 2; 4104228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return ySize + uvSize * 2; 4105228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 4106228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 4107228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 4108228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 4109228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 4; 4110228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 4111228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 4112228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala default: 4113228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 4114228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, format); 4115228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return 0; 4116228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 4117228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 41188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 411961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android 4120