Camera2Client.cpp revision d32b99b1a87497280add6efc0e99bd383e402de1
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 174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2" 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> 27e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter#include "camera2/Parameters.h" 2810894e509f777c6bd7e408a57f5cf21ee2b36a96James Painter#include "Camera2Client.h" 2961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); 3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); 3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android { 342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalausing namespace camera2; 352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() { 3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return IPCThreadState::self()->getCallingPid(); 3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService 4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService, 4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala const sp<ICameraClient>& cameraClient, 4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int cameraId, 4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int cameraFacing, 46ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin int clientPid, 47ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin int servicePid): 4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala Client(cameraService, cameraClient, 49ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin cameraId, cameraFacing, clientPid, servicePid), 50ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala mSharedCameraClient(cameraClient), 5173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mParameters(cameraId, cameraFacing) 52f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 53a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGI("Camera %d: Opened", cameraId); 5561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 56f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice = new Camera2Device(cameraId); 57228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.state = Parameters::DISCONNECTED; 60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 623a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const { 633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala int callingPid = getCallingPid(); 64c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala if (callingPid == mClientPid) return NO_ERROR; 653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala ALOGE("%s: attempt to use a locked camera from a different process" 67c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid); 683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala return PERMISSION_DENIED; 693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala} 703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module) 72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 73a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 74c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId); 75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = mDevice->initialize(module); 78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 84174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala res = mDevice->setNotifyCallback(this); 85174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = l.mParameters.initialize(&(mDevice->info())); 89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala String8 threadName; 96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 9773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mStreamingProcessor = new StreamingProcessor(this); 9873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 99ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala mFrameProcessor = new FrameProcessor(this); 1004bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala threadName = String8::format("C2-%d-FrameProc", 101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCameraId); 102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mFrameProcessor->run(threadName.string()); 103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureSequencer = new CaptureSequencer(this); 1054bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala threadName = String8::format("C2-%d-CaptureSeq", 106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCameraId); 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureSequencer->run(threadName.string()); 108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mJpegProcessor = new JpegProcessor(this, mCaptureSequencer); 1104bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala threadName = String8::format("C2-%d-JpegProc", 111ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala mCameraId); 112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mJpegProcessor->run(threadName.string()); 113ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala 114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslProcessor = new ZslProcessor(this, mCaptureSequencer); 1154bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala threadName = String8::format("C2-%d-ZslProc", 116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCameraId); 117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslProcessor->run(threadName.string()); 118ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala 119d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala mCallbackProcessor = new CallbackProcessor(this); 1204bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala threadName = String8::format("C2-%d-CallbkProc", 121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCameraId); 122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCallbackProcessor->run(threadName.string()); 123d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala 124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (gLogLevel >= 1) { 125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCameraId); 1272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGD("%s", l.mParameters.paramsFlattened.string()); 128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 13161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 13261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 13361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() { 134a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1354ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDestructionStarted = true; 137f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 138c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala disconnect(); 139c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGI("Camera %d: Closed", mCameraId); 14161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 14261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 14361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) { 144611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala String8 result; 1453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", 146611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mCameraId, 147611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala getCameraClient()->asBinder().get(), 148611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mClientPid); 1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" State: "); 1507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const Parameters& p = mParameters.unsafeAccess(); 153836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala result.append(Parameters::getStateName(p.state)); 1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append("\n Current parameters:\n"); 1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview size: %d x %d\n", 158836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewWidth, p.previewHeight); 1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview FPS range: %d - %d\n", 160836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFpsRange[0], p.previewFpsRange[1]); 1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview HAL pixel format: 0x%x\n", 162836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFormat); 16311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala result.appendFormat(" Preview transform: %x\n", 164836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewTransform); 1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Picture size: %d x %d\n", 166836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.pictureWidth, p.pictureHeight); 1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 168836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegThumbSize[0], p.jpegThumbSize[1]); 1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 170836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegQuality, p.jpegThumbQuality); 171836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation); 1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS tags %s\n", 173836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsEnabled ? "enabled" : "disabled"); 174836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (p.gpsEnabled) { 1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 176836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[0], p.gpsCoordinates[1], 177836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[2]); 1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS timestamp: %lld\n", 179836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsTimestamp); 1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS processing method: %s\n", 181836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsProcessingMethod.string()); 1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" White balance mode: "); 185836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.wbMode) { 186d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO) 187d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT) 188d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT) 189d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT) 190d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT) 191d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT) 192d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT) 193d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE) 1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Effect mode: "); 198836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.effectMode) { 199d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF) 200d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO) 201d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE) 202d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE) 203d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA) 204d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE) 205d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD) 206d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD) 207d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA) 2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Antibanding mode: "); 212836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.antibandingMode) { 213d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO) 214d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF) 215d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ) 216d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ) 2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Scene mode: "); 221836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.sceneMode) { 2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append("AUTO\n"); break; 2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Flash mode: "); 243836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.flashMode) { 2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focus mode: "); 254836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.focusMode) { 2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 266d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala result.append(" Focus state: "); 267d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala switch (p.focusState) { 268d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE) 269d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN) 270d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED) 271d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN) 272d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED) 273d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) 274d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala default: result.append("UNKNOWN\n"); 275d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala } 276d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala 2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focusing areas:\n"); 278836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.focusingAreas.size(); i++) { 2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 280836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].left, 281836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].top, 282836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].right, 283836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].bottom, 284836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].weight); 2857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Exposure compensation index: %d\n", 288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.exposureCompensation); 2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" AE lock %s, AWB lock %s\n", 291836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoExposureLock ? "enabled" : "disabled", 292836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoWhiteBalanceLock ? "enabled" : "disabled" ); 2937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Metering areas:\n"); 295836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.meteringAreas.size(); i++) { 2967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 297836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].left, 298836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].top, 299836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].right, 300836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].bottom, 301836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].weight); 3027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 3037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Zoom index: %d\n", p.zoom); 305836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Video size: %d x %d\n", p.videoWidth, 306836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoHeight); 3077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3083297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Recording hint is %s\n", 309836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.recordingHint ? "set" : "not set"); 3107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Video stabilization is %s\n", 312836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoStabilization ? "enabled" : "disabled"); 3137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current streams:\n"); 315da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result.appendFormat(" Preview stream ID: %d\n", 316da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala getPreviewStreamId()); 317ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala result.appendFormat(" Capture stream ID: %d\n", 318da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala getCaptureStreamId()); 319da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result.appendFormat(" Recording stream ID: %d\n", 320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala getRecordingStreamId()); 321e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 322e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala result.append(" Quirks for this camera:\n"); 323e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala bool haveQuirk = false; 324e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala if (p.quirks.triggerAfWithAuto) { 325e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala result.appendFormat(" triggerAfWithAuto\n"); 326e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala haveQuirk = true; 327e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala } 328e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala if (p.quirks.useZslFormat) { 329e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala result.appendFormat(" useZslFormat\n"); 330e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala haveQuirk = true; 331e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala } 3327373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (p.quirks.meteringCropRegion) { 3337373cbe85e617345f7002256a4be389fe62af913Igor Murashkin result.appendFormat(" meteringCropRegion\n"); 3347373cbe85e617345f7002256a4be389fe62af913Igor Murashkin haveQuirk = true; 3357373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 336e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala if (!haveQuirk) { 337e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala result.appendFormat(" none\n"); 338e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala } 339e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 34073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala write(fd, result.string(), result.size()); 3413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 34273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mStreamingProcessor->dump(fd, args); 343428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala 344da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureSequencer->dump(fd, args); 345da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 346c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mFrameProcessor->dump(fd, args); 347c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 34897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala mZslProcessor->dump(fd, args); 34997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 3503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Device dump:\n"; 351611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala write(fd, result.string(), result.size()); 3527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t res = mDevice->dump(fd, args); 3543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (res != OK) { 3553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Error dumping device: %s (%d)", 3563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala strerror(-res), res); 3573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 3583297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 3597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM 361611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala return NO_ERROR; 36261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 36361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 36461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface 36561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 36661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() { 367a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 368ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 369c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala 370c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala // Allow both client and the media server to disconnect at all times 371c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala int callingPid = getCallingPid(); 372c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala if (callingPid != mClientPid && callingPid != mServicePid) return; 373ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mDevice == 0) return; 375f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 37698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala ALOGV("Camera %d: Shutting down", mCameraId); 37798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 378d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala stopPreviewL(); 3796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 38098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala { 38198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala SharedParameters::Lock l(mParameters); 382c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala if (l.mParameters.state == Parameters::DISCONNECTED) return; 38398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala l.mParameters.state = Parameters::DISCONNECTED; 38498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala } 38598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 38673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mStreamingProcessor->deletePreviewStream(); 38773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mStreamingProcessor->deleteRecordingStream(); 388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mJpegProcessor->deleteStream(); 389d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala mCallbackProcessor->deleteStream(); 390cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala mZslProcessor->deleteStream(); 391cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala 39298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mFrameProcessor->requestExit(); 39398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mCaptureSequencer->requestExit(); 39498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mJpegProcessor->requestExit(); 39598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mZslProcessor->requestExit(); 39698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mCallbackProcessor->requestExit(); 39798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 39898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala ALOGV("Camera %d: Waiting for threads", mCameraId); 39998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 40098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mFrameProcessor->join(); 40198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mCaptureSequencer->join(); 40298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mJpegProcessor->join(); 40398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mZslProcessor->join(); 40498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mCallbackProcessor->join(); 40598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 40698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala ALOGV("Camera %d: Disconnecting device", mCameraId); 40798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 40898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mDevice->disconnect(); 40998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 4103a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mDevice.clear(); 4118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 41261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala CameraService::Client::disconnect(); 41361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 41461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 41561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) { 416a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4179e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 418ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 419ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != 0 && getCallingPid() != mClientPid) { 4219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Connection attempt from pid %d; " 4229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "current locked to pid %d", __FUNCTION__, 4239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraId, getCallingPid(), mClientPid); 4249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return BAD_VALUE; 4259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 4299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient = client; 430a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala mSharedCameraClient = client; 4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 43361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 43461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 43561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() { 436a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4379e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 438ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 441ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == 0) { 4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != getCallingPid()) { 4489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 4519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 45461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 45561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 45661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() { 457a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4589e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 459ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 462ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == getCallingPid()) { 464907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala SharedParameters::Lock l(mParameters); 465907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala if (l.mParameters.state == Parameters::RECORD || 466907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 467907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala ALOGD("Not allowed to unlock camera during recording."); 468907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala return INVALID_OPERATION; 469907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala } 4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = 0; 4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraClient.clear(); 472a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala mSharedCameraClient.clear(); 4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 4779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 47961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 48061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay( 4826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<Surface>& surface) { 483a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4849e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 485ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 4863a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 4873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 488ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 4906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 4916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surface != 0) { 4926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surface->asBinder(); 4936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = surface; 4946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 4956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 49636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder,window); 49761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 49861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture( 5006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<ISurfaceTexture>& surfaceTexture) { 501a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5029e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 503ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 5043a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 5053a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 506ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 5076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 5086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 5096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surfaceTexture != 0) { 5106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala binder = surfaceTexture->asBinder(); 5116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = new SurfaceTextureClient(surfaceTexture); 5126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 51336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder, window); 5146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 51636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder, 517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala sp<ANativeWindow> window) { 518a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 5206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (binder == mPreviewSurface) { 5229e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: New window is same as old window", 5239e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId); 5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return NO_ERROR; 5256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 527f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala Parameters::State state; 528f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala { 529f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala SharedParameters::Lock l(mParameters); 530f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala state = l.mParameters.state; 531f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala } 532f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala switch (state) { 5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 5379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 539f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala Parameters::getStateName(state)); 5409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 5439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK 5449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 5469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Already running preview - need to stop and create a new stream 5474865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala mStreamingProcessor->stopStream(); 548f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 5499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 5519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 552bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala mPreviewSurface = binder; 55373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->setPreviewWindow(window); 55473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (res != OK) { 55573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Unable to set new preview window: %s (%d)", 55673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala __FUNCTION__, strerror(-res), res); 55773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return res; 55873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 559bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 560f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) { 561f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala SharedParameters::Lock l(mParameters); 562f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala l.mParameters.state = state; 5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startPreviewL(l.mParameters, false); 5646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 56761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 56861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 56961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) { 570a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag); 572ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 573ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin 574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala setPreviewCallbackFlagL(l.mParameters, flag); 578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters ¶ms, int flag) { 581228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res = OK; 582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) { 583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: setting oneshot", __FUNCTION__); 584228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewCallbackOneShot = true; 585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (params.previewCallbackFlags != (uint32_t)flag) { 587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewCallbackFlags = flag; 588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch(params.state) { 5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startPreviewL(params, true); 591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startRecordingL(params, true); 595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala default: 597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 600228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to refresh request in state %s", 6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 604228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 605228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 60661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 60761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 60861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() { 609a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6109e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 611ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 6123a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startPreviewL(l.mParameters, false); 616d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 617ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters ¶ms, bool restart) { 619d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 6206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 62122d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 62222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart); 62322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 624a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala if ( (params.state == Parameters::PREVIEW || 625a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala params.state == Parameters::RECORD || 626a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala params.state == Parameters::VIDEO_SNAPSHOT) 627a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala && !restart) { 628a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala // Succeed attempt to re-enter a streaming state 629a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala ALOGI("%s: Camera %d: Preview already active, ignoring restart", 630a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala __FUNCTION__, mCameraId); 63177449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray return OK; 63277449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray } 63377449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray if (params.state > Parameters::PREVIEW && !restart) { 6344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGE("%s: Can't start preview in state %s", 6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 6374ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return INVALID_OPERATION; 6384ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 6396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 64073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (!mStreamingProcessor->haveValidPreviewWindow()) { 6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 6426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 6436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::STOPPED; 6459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 64673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updatePreviewStream(params); 647be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 650be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 6516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 65273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 65373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala Vector<uint8_t> outputStreams; 654228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool callbacksEnabled = params.previewCallbackFlags & 655228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 656228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 657d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala res = mCallbackProcessor->updateStream(params); 658228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 659228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 660228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 661228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 662228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 66373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getCallbackStreamId()); 664228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 6655a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala if (params.zslMode && !params.recordingHint) { 666da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mZslProcessor->updateStream(params); 667da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 668da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)", 669da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 670da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 671da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 67273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getZslStreamId()); 673da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 6746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 67573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getPreviewStreamId()); 67673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 6775a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala if (!params.recordingHint) { 67873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (!restart) { 67973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updatePreviewRequest(params); 6805a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala if (res != OK) { 68173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Camera %d: Can't set up preview request: " 68273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, 68373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala strerror(-res), res); 6845a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala return res; 6855a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala } 6865a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala } 68773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW, 68873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams); 6895a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala } else { 6905a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala // With recording hint set, we're going to be operating under the 6915a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala // assumption that the user will record video. To optimize recording 6925a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala // startup time, create the necessary output streams for recording and 6935a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala // video snapshot now if they don't already exist. 6945a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala res = mJpegProcessor->updateStream(params); 6955a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala if (res != OK) { 6965a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala ALOGE("%s: Camera %d: Can't pre-configure still image " 6975a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala "stream: %s (%d)", 698be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 699be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 700be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 701da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 70273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (!restart) { 70373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updateRecordingRequest(params); 70473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (res != OK) { 70573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Camera %d: Can't set up preview request with " 70673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala "record hint: %s (%d)", __FUNCTION__, mCameraId, 70773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala strerror(-res), res); 70873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return res; 70973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 71073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 71173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 71273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams); 713be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 714be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 71573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)", 716be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 7186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::PREVIEW; 7216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 72261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 72361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 72461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() { 725a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 7269e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 727ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7283a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 7293a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 73036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala stopPreviewL(); 731ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala} 732ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 73336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() { 734ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala ATRACE_CALL(); 7354865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala status_t res; 736d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds 7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::State state; 738228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala { 7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala state = l.mParameters.state; 741228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 742228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 743228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (state) { 7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 745d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Call before initialized", 746d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId); 747d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 7482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 749d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 751d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout); 752d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala // no break 7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 75573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mStreamingProcessor->stopStream(); 7564865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala res = mDevice->waitUntilDrained(); 7574865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (res != OK) { 7584865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 7594865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7604865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } 761228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // no break 7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: { 7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala commandStopFaceDetectionL(l.mParameters); 766d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 767228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 768d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 769d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 770228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala state); 771d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 77261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 77361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 77461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() { 775a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 776ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 7783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return false; 7793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return l.mParameters.state == Parameters::PREVIEW; 78261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 78361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 78461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 785a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 786ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 7873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 7883a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 7893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 79478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Can't be called in state %s", 7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 79778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 79878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala default: 79978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala // OK 80078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala break; 80178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 80278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.storeMetadataInBuffers = enabled; 80478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 80578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return OK; 80661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 80761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 80861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() { 809a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 8109e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 811ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 8133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 8142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 815228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 8162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startRecordingL(l.mParameters, false); 817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 8183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters ¶ms, bool restart) { 820228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res; 82122d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 82222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart); 82322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 824228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (params.state) { 8252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startPreviewL(params, false); 8279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) return res; 8289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 8309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Ready to go 8319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 834228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // OK to call this when recording is already on, just skip unless 835228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // we're looking to restart 836228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!restart) return OK; 8379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 8389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 8399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't start recording in state %s", 8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 8429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 8439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 8449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 845228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!params.storeMetadataInBuffers) { 84678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording only supported in metadata mode, but " 84778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "non-metadata recording mode requested!", __FUNCTION__, 84878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mCameraId); 84978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 85078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 85178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 85273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (!restart) { 85373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 85473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mStreamingProcessor->updateRecordingRequest(params); 85573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (res != OK) { 85673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 85773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 85873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return res; 85973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 86073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 861609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala 86273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updateRecordingStream(params); 8639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 8649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 8659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 8669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 8679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 86873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 86973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala Vector<uint8_t> outputStreams; 870228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool callbacksEnabled = params.previewCallbackFlags & 871228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 872228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 873d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala res = mCallbackProcessor->updateStream(params); 874228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 875228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 876228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 877228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 878228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 87973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getCallbackStreamId()); 880228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 88173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getPreviewStreamId()); 88273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getRecordingStreamId()); 8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 88473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 88573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams); 8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 88773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)", 8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 8909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 8919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 8922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state < Parameters::RECORD) { 8932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::RECORD; 894228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 8959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 8969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 89761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 89861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 89961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() { 900a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 9019e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 902ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 9032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 904228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 9059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 9063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 9073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 9092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 9109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to stop 9119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 9142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 9152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 9169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 9179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop recording in state %s", 9182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 9192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 9209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 9219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 9229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 923609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 924609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala 9255a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala res = startPreviewL(l.mParameters, true); 9269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 9275a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to return to preview", 9285a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala __FUNCTION__, mCameraId); 9299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 93061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 93161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 93261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() { 933a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 934ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 9358da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9363a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return false; 9373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 9388da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong return recordingEnabledL(); 9398da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong} 9408da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9418da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() { 9428da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong ATRACE_CALL(); 9432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 9448da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return (l.mParameters.state == Parameters::RECORD 9462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || l.mParameters.state == Parameters::VIDEO_SNAPSHOT); 94761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 94861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 94961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 950a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 951ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 9523a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 95330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 95473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mStreamingProcessor->releaseRecordingFrame(mem); 95561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 95661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 95761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() { 958a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 959ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 9608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 9613a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 9623a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 9633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 964174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 965d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala bool notifyImmediately = false; 966d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala bool notifySuccess = false; 967174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 9682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 9694865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (l.mParameters.state < Parameters::PREVIEW) { 9704865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return INVALID_OPERATION; 9714865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } 9724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 9735f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin /** 9745f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin * If the camera does not support auto-focus, it is a no-op and 9755f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin * onAutoFocus(boolean, Camera) callback will be called immediately 9765f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin * with a fake value of success set to true. 9775f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin */ 9785f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED) { 979d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala notifyImmediately = true; 980d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala notifySuccess = true; 981d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala } 982d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala /** 983d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala * If we're in CAF mode, and AF has already been locked, just fire back 984d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala * the callback right away; the HAL would not send a notification since 985d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala * no state change would happen on a AF trigger. 986d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala */ 987d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE || 988d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) && 989d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) { 990d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala notifyImmediately = true; 991d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala notifySuccess = true; 992d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala } 993d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala /** 994d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala * Send immediate notification back to client 995d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala */ 996d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala if (notifyImmediately) { 9975f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin SharedCameraClient::Lock l(mSharedCameraClient); 9985f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin if (l.mCameraClient != 0) { 9995f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, 1000d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala notifySuccess ? 1 : 0, 0); 10015f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin } 10025f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin return OK; 10035f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin } 1004d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala /** 1005d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala * Handle quirk mode for AF in scene modes 1006d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala */ 100795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala if (l.mParameters.quirks.triggerAfWithAuto && 100895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED && 1009ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO && 1010ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala !l.mParameters.focusingAreas[0].isEmpty()) { 101195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala ALOGV("%s: Quirk: Switching from focusMode %d to AUTO", 101295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala __FUNCTION__, l.mParameters.focusMode); 101395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.shadowFocusMode = l.mParameters.focusMode; 101495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 101595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala updateRequests(l.mParameters); 101695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala } 101795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala 10182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter; 10192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala triggerId = l.mParameters.currentAfTriggerId; 1020174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 10214865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala syncWithDevice(); 1022174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1023174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerAutofocus(triggerId); 1024174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 10256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 102661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 102761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 102861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() { 1029a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1030ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 10318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 10323a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 10333a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 10343a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 1035174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 1036174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 10372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 10382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala triggerId = ++l.mParameters.afTriggerCounter; 103995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala 104095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // When using triggerAfWithAuto quirk, may need to reset focus mode to 1041ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala // the real state at this point. No need to cancel explicitly if 1042ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala // changing the AF mode. 104395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) { 104495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__, 104595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.shadowFocusMode); 104695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.focusMode = l.mParameters.shadowFocusMode; 104795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID; 104895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala updateRequests(l.mParameters); 1049ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala 1050ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala return OK; 105195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala } 1052174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 10534865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala syncWithDevice(); 1054174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1055174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerCancelAutofocus(triggerId); 1056174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 10576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 105861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 105961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 1060ff82370c7c04340d50673d425f48acafd00f2bc9Ben Murdochstatus_t Camera2Client::takePicture(int msgType) { 1061a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1062ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 1063d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 10643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1065d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1066b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala { 1067b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala SharedParameters::Lock l(mParameters); 1068b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala switch (l.mParameters.state) { 1069b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::DISCONNECTED: 1070b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::STOPPED: 1071b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 1072b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 1073da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, mCameraId); 1074b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala return INVALID_OPERATION; 1075b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::PREVIEW: 1076b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala // Good to go for takePicture 1077b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala res = commandStopFaceDetectionL(l.mParameters); 1078b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala if (res != OK) { 1079b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop face detection for still capture", 1080b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala __FUNCTION__, mCameraId); 1081b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala return res; 1082b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala } 1083b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala l.mParameters.state = Parameters::STILL_CAPTURE; 1084b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala break; 1085b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::RECORD: 1086b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala // Good to go for video snapshot 1087b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala l.mParameters.state = Parameters::VIDEO_SNAPSHOT; 1088b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala break; 1089b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::STILL_CAPTURE: 1090b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 1091b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala ALOGE("%s: Camera %d: Already taking a picture", 1092b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala __FUNCTION__, mCameraId); 1093b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala return INVALID_OPERATION; 1094b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala } 1095d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1096b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId); 1097d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1098b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala res = mJpegProcessor->updateStream(l.mParameters); 1099b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala if (res != OK) { 1100b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 1101b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1102b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala return res; 1103b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala } 1104228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 11058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 11064865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala // Need HAL to have correct settings before (possibly) triggering precapture 11074865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala syncWithDevice(); 11084865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 1109aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin res = mCaptureSequencer->startCapture(msgType); 1110d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to start capture: %s (%d)", 1112d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 111661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 111761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 111861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) { 1119a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 11208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 1121ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala status_t res; 11233a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 11243a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 11252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 11266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = l.mParameters.set(params); 11282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) return res; 11299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 11302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = updateRequests(l.mParameters); 11318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 11328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 113361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 1134f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 113561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const { 1136a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 11378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 1138ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 11393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return String8(); 1140ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::ReadLock l(mParameters); 1142ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 11438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return l.mParameters.get(); 114461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 114561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 114661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1147a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1148ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala Mutex::Autolock icl(mICameraLock); 11493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 11503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1151c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1152c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1153c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala cmd, arg1, arg2); 1154c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 115536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala switch (cmd) { 115636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_SMOOTH_ZOOM: 115736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartSmoothZoomL(); 115836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_STOP_SMOOTH_ZOOM: 115936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStopSmoothZoomL(); 116036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_DISPLAY_ORIENTATION: 116136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetDisplayOrientationL(arg1); 116236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_SHUTTER_SOUND: 116336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableShutterSoundL(arg1 == 1); 116436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PLAY_RECORDING_SOUND: 116536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPlayRecordingSoundL(); 116636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_FACE_DETECTION: 116736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartFaceDetectionL(arg1); 1168228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case CAMERA_CMD_STOP_FACE_DETECTION: { 11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return commandStopFaceDetectionL(l.mParameters); 1171228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 117236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG: 117336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableFocusMoveMsgL(arg1 == 1); 117436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PING: 117536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPingL(); 117636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT: 117736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetVideoBufferCountL(arg1); 117836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala default: 117936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unknown command %d (arguments %d, %d)", 118036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, cmd, arg1, arg2); 1181c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 118236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 118336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 118436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 118536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() { 118636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 118736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 118836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 118936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 119036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() { 119136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 119236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 119336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 119436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 119536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) { 11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int transform = Parameters::degToTransform(degrees, 119736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 119836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (transform == -1) { 119936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as display orientation value", 120036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, mCameraId, degrees); 120136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return BAD_VALUE; 120236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 12032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 12042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (transform != l.mParameters.previewTransform && 120573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala getPreviewStreamId() != NO_STREAM) { 120673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mDevice->setStreamTransform(getPreviewStreamId(), transform); 120736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 12082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.previewTransform = transform; 120936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 121036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 121136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 121236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) { 12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 121436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (enable) { 12152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.playShutterSound = true; 1216c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return OK; 121736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1218983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 121936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound may not be allowed. In that case only 122036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // allow the mediaserver process to disable the sound. 122136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala char value[PROPERTY_VALUE_MAX]; 122236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala property_get("ro.camera.sound.forced", value, "0"); 122336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (strncmp(value, "0", 2) != 0) { 122436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound is not allowed. Deny if the current 122536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // process is not mediaserver. 122636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (getCallingPid() != getpid()) { 122736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("Failed to disable shutter sound. Permission denied (pid %d)", 122836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala getCallingPid()); 122936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return PERMISSION_DENIED; 1230983cf231ab2d176a14595cdae46ff1b0c239af47James Dong } 123136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1232983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 12332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.playShutterSound = false; 123436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 123536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 1236983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 123736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() { 123836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 123936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 124036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 124136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1242ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinstatus_t Camera2Client::commandStartFaceDetectionL(int /*type*/) { 12438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Starting face detection", 12448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 12458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 12482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 12492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 12502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 12512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 12528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot start face detection without preview active", 12538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 12548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return INVALID_OPERATION; 12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 12562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 12588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // Good to go for starting face detect 12598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala break; 12608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 12618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // Ignoring type 12622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.fastInfo.bestFaceDetectMode == 1263d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) { 12648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Face detection not supported", 12658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 12668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return INVALID_OPERATION; 12678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 12682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFaceDetect) return OK; 12698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 12702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.enableFaceDetect = true; 12718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = updateRequests(l.mParameters); 12738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 12748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 127536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 127636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1277228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters ¶ms) { 12788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res = OK; 12798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Stopping face detection", 12808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 12818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1282228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!params.enableFaceDetect) return OK; 12838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1284228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.enableFaceDetect = false; 12858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state == Parameters::PREVIEW 12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || params.state == Parameters::RECORD 12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || params.state == Parameters::VIDEO_SNAPSHOT) { 1289228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateRequests(params); 12908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 12918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 12928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 129336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 129436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 129536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) { 12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.enableFocusMoveMessages = enable; 1298174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 129936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 130036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 130136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 130236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() { 130336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Always ping back if access is proper and device is alive 13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.state != Parameters::DISCONNECTED) { 1306983cf231ab2d176a14595cdae46ff1b0c239af47James Dong return OK; 130736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } else { 130836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return NO_INIT; 130936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 131036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 131136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 131236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) { 13138da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong if (recordingEnabledL()) { 131436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting video buffer count after " 131536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala "recording was started", __FUNCTION__, mCameraId); 131636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return INVALID_OPERATION; 1317c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1318c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 131973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return mStreamingProcessor->setRecordingBufferCount(count); 132061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 132161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 13223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */ 13233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1324160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) { 1325160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2); 1326160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1327160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1328160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) { 1329ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin (void)frameNumber; 1330ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin (void)timestamp; 1331160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__, 1332160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala frameNumber, timestamp); 1333160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1334160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1335160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) { 1336160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autofocus state now %d, last trigger %d", 1337160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1338174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendCompletedMessage = false; 1339174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendMovingMessage = false; 1340174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1341174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool success = false; 1342174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool afInMotion = false; 1343174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 1345d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala l.mParameters.focusState = newState; 13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.focusMode) { 1347174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 1348174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 1349174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for the current AF 1350174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // trigger. For example, if cancel was called in between, or if we 1351174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // already sent a notification about this AF call. 13522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (triggerId != l.mParameters.currentAfTriggerId) break; 1353174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1354174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1355174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1356174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1357174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1358174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 13592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = -1; 1360174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1361174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 1362174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Just starting focusing, ignore 1363174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1364174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1365174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1366174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1367174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1368174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Unexpected in AUTO/MACRO mode 1369174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d", 1370174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, newState); 1371174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1372174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1373174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1374174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1375174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1376174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1377174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1380174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for 1382174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // the current AF trigger. For example, if cancel was 1383174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // called in between, or if we already sent a 1384174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // notification about this AF call. 1385174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Send both a 'AF done' callback and a 'AF move' callback 13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (triggerId != l.mParameters.currentAfTriggerId) break; 1387174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 1388174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 13892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages && 13902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion) { 1391174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1392174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 13932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = -1; 1394174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1395174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1396174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Cancel was called, or we switched state; care if 1397174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // currently moving 1398174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 13992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages && 14002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion) { 1401174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1402174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1403174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Start passive scan, inform upstream 1406174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = true; 1407174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1408174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1409174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Stop passive scan, inform upstream 14102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages) { 1411174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1412174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1413174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1414174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 14152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion = afInMotion; 1416174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1417174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 1418174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 1419174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 1420174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1421174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) { 1422a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala ALOGE("%s: Unexpected AF state change %d " 1423a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala "(ID %d) in focus mode %d", 1424a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala __FUNCTION__, newState, triggerId, 1425a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala l.mParameters.focusMode); 1426174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1427174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1428174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1429174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (sendMovingMessage) { 1430a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala SharedCameraClient::Lock l(mSharedCameraClient); 1431a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala if (l.mCameraClient != 0) { 1432a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE, 14338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala afInMotion ? 1 : 0, 0); 14348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1435174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1436603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala if (sendCompletedMessage) { 1437a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala SharedCameraClient::Lock l(mSharedCameraClient); 1438a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala if (l.mCameraClient != 0) { 1439a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, 1440a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala success ? 1 : 0, 0); 14418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1442603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala } 1443160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1444160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1445160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) { 1446160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autoexposure state now %d, last trigger %d", 1447160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1448da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureSequencer->notifyAutoExposure(newState, triggerId); 1449160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1450160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1451160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) { 1452ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin (void)newState; 1453ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin (void)triggerId; 1454160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Auto-whitebalance state now %d, last trigger %d", 1455160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1456160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1457160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1458da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCameraId() const { 1459a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala return mCameraId; 1460c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 1461c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 1462a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaconst sp<Camera2Device>& Camera2Client::getCameraDevice() { 1463a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala return mDevice; 1464c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 1465c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 1466609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvalaconst sp<CameraService>& Camera2Client::getCameraService() { 1467609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala return mCameraService; 1468609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala} 1469609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala 1470a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() { 1471a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala return mParameters; 1472c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 1473c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 1474da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const { 147573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return mStreamingProcessor->getPreviewStreamId(); 1476da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1477da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1478da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const { 1479da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mJpegProcessor->getStreamId(); 1480da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1481da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1482da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const { 1483da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mCallbackProcessor->getStreamId(); 1484da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1485da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1486da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const { 148773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return mStreamingProcessor->getRecordingStreamId(); 1488da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1489da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1490da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getZslStreamId() const { 1491da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mZslProcessor->getStreamId(); 1492da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1493da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 14944865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId, 14954865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala wp<camera2::FrameProcessor::FilteredListener> listener) { 14964865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return mFrameProcessor->registerListener(minId, maxId, listener); 14974865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala} 14984865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 14994865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId, 1500da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala wp<camera2::FrameProcessor::FilteredListener> listener) { 15014865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return mFrameProcessor->removeListener(minId, maxId, listener); 1502da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1503da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 15044865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::stopStream() { 15054865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return mStreamingProcessor->stopStream(); 1506da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1507da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1508a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client): 1509a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala mCameraClient(client.mCameraClient), 1510a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala mSharedClient(client) { 1511a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala mSharedClient.mCameraClientLock.lock(); 1512c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 1513c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 1514a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::~Lock() { 1515a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala mSharedClient.mCameraClientLock.unlock(); 15168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 15178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1518ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville TalvalaCamera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client): 1519ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala mCameraClient(client) { 1520ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala} 1521ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala 1522a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=( 1523a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala const sp<ICameraClient>&client) { 1524a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala Mutex::Autolock l(mCameraClientLock); 1525a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala mCameraClient = client; 1526a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala return *this; 1527a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala} 15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1529a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalavoid Camera2Client::SharedCameraClient::clear() { 1530a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala Mutex::Autolock l(mCameraClientLock); 1531a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala mCameraClient.clear(); 15328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 15338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart; 15354865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd; 15364865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart; 15374865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd; 15384865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart; 15394865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd; 1540da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 15413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */ 15423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 15435a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters ¶ms) { 15448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 15458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 154622d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state); 154722d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 15484865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala res = mStreamingProcessor->incrementStreamingIds(); 15494865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (res != OK) { 15504865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)", 15514865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15524865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return res; 15534865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } 15544865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 155573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updatePreviewRequest(params); 15568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 15588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 156173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updateRecordingRequest(params); 15628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 15648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state == Parameters::PREVIEW) { 15695a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala res = startPreviewL(params, true); 15708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 15728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (params.state == Parameters::RECORD || 15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state == Parameters::VIDEO_SNAPSHOT) { 157773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = startRecordingL(params, true); 15788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 15808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 15868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height, 1589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala int format, int stride) { 1590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (format) { 1591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 1592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 1594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 3 / 2; 1595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 1596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: { // YV12 1598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t ySize = stride * height; 1599f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala size_t uvStride = (stride / 2 + 0xF) & ~0xF; 1600228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t uvSize = uvStride * height / 2; 1601228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return ySize + uvSize * 2; 1602228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 1603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 1604228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1605228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 1606228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 4; 1607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 1608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1609228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala default: 1610228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 1611228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, format); 1612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return 0; 1613228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 1614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 16158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 16164865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::syncWithDevice() { 16174865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala ATRACE_CALL(); 161843b7ac6bd1a949ecb8ffc7e50d0a2f01a6258034Eino-Ville Talvala const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms 16194865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala status_t res; 16204865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 16214865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala int32_t activeRequestId = mStreamingProcessor->getActiveRequestId(); 16224865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (activeRequestId == 0) return OK; 16234865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 16244865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout); 16254865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (res == TIMED_OUT) { 16264865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala ALOGE("%s: Camera %d: Timed out waiting sync with HAL", 16274865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala __FUNCTION__, mCameraId); 16284865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } else if (res != OK) { 16294865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala ALOGE("%s: Camera %d: Error while waiting to sync with HAL", 16304865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala __FUNCTION__, mCameraId); 16314865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } 16324865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return res; 16334865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala} 16344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 163561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android 1636