Camera2Client.cpp revision a9c64a9398ac2e6173f99e252f305808a34cab1c
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 17852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-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/Surface.h> 26c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include "camera2/Parameters.h" 27fe140e882c578883238a2dd7793159c848a07b49James Painter#include "Camera2Client.h" 287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "Camera2Device.h" 297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "Camera3Device.h" 3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "camera2/ZslProcessor.h" 322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "camera2/ZslProcessor3.h" 332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); 3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); 3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android { 382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalausing namespace camera2; 392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() { 4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return IPCThreadState::self()->getCallingPid(); 4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService 4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService, 4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala const sp<ICameraClient>& cameraClient, 4848af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala const String16& clientPackageName, 4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int cameraId, 5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int cameraFacing, 518dcdb9553defafa1166c64b496e1ee390e4eadfaIgor Murashkin int clientPid, 5248af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala uid_t clientUid, 537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int servicePid, 547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int deviceVersion): 55a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Camera2ClientBase(cameraService, cameraClient, clientPackageName, 5648af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala cameraId, cameraFacing, clientPid, clientUid, servicePid), 572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mParameters(cameraId, cameraFacing), 582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mDeviceVersion(deviceVersion) 59f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 60a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGI("Camera %d: Opened", cameraId); 6261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin switch (mDeviceVersion) { 647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala case CAMERA_DEVICE_API_VERSION_2_0: 657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mDevice = new Camera2Device(cameraId); 667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala break; 677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala case CAMERA_DEVICE_API_VERSION_3_0: 687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mDevice = new Camera3Device(cameraId); 697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala break; 707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala default: 717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("Camera %d: Unknown HAL device version %d", 722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin cameraId, mDeviceVersion); 737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mDevice = NULL; 747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala break; 757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 77228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.state = Parameters::DISCONNECTED; 80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module) 83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 84a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 85c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId); 86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 889ab909bff49b2eccde1b028901717c193ef723afIgor Murashkin res = Camera2ClientBase::initialize(module); 8948af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala if (res != OK) { 9048af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala return res; 9148af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala } 9248af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala 932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = l.mParameters.initialize(&(mDevice->info())); 96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) { 97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return NO_INIT; 100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala String8 threadName; 10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 10443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor = new StreamingProcessor(this); 105254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala threadName = String8::format("C2-%d-StreamProc", 106254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala mCameraId); 107254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala mStreamingProcessor->run(threadName.string()); 10843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 10971381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin mFrameProcessor = new FrameProcessor(mDevice, this); 110852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala threadName = String8::format("C2-%d-FrameProc", 11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCameraId); 11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mFrameProcessor->run(threadName.string()); 11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureSequencer = new CaptureSequencer(this); 115852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala threadName = String8::format("C2-%d-CaptureSeq", 11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCameraId); 11769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureSequencer->run(threadName.string()); 11869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mJpegProcessor = new JpegProcessor(this, mCaptureSequencer); 120852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala threadName = String8::format("C2-%d-JpegProc", 121177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala mCameraId); 12269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mJpegProcessor->run(threadName.string()); 123177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala 1242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin switch (mDeviceVersion) { 1252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case CAMERA_DEVICE_API_VERSION_2_0: { 1262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<ZslProcessor> zslProc = 1272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin new ZslProcessor(this, mCaptureSequencer); 1282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessor = zslProc; 1292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessorThread = zslProc; 1302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 1312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case CAMERA_DEVICE_API_VERSION_3_0:{ 1332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<ZslProcessor3> zslProc = 1342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin new ZslProcessor3(this, mCaptureSequencer); 1352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessor = zslProc; 1362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessorThread = zslProc; 1372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 1382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin default: 1402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 1412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 142852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala threadName = String8::format("C2-%d-ZslProc", 14369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCameraId); 1442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessorThread->run(threadName.string()); 145177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala 1462863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala mCallbackProcessor = new CallbackProcessor(this); 147852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala threadName = String8::format("C2-%d-CallbkProc", 14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCameraId); 14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCallbackProcessor->run(threadName.string()); 1502863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala 151f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (gLogLevel >= 1) { 152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCameraId); 1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGD("%s", l.mParameters.paramsFlattened.string()); 155f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 156f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 157f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 15861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 15961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 16061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() { 161a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 16202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGV("~Camera2Client"); 1634ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 164f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDestructionStarted = true; 165f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 166617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala disconnect(); 167c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGI("Camera %d: Closed", mCameraId); 16961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 17061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 17161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) { 172611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala String8 result; 1737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala result.appendFormat("Client2[%d] (%p) Client: %s PID: %d, dump:\n", 174611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mCameraId, 175a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin getRemoteCallback()->asBinder().get(), 1767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala String8(mClientPackageName).string(), 177611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mClientPid); 1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" State: "); 1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const Parameters& p = mParameters.unsafeAccess(); 182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala result.append(Parameters::getStateName(p.state)); 1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1854ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append("\n Current parameters:\n"); 1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview size: %d x %d\n", 187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewWidth, p.previewHeight); 1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview FPS range: %d - %d\n", 189836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFpsRange[0], p.previewFpsRange[1]); 1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview HAL pixel format: 0x%x\n", 191836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFormat); 19211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala result.appendFormat(" Preview transform: %x\n", 193836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewTransform); 1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Picture size: %d x %d\n", 195836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.pictureWidth, p.pictureHeight); 1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 197836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegThumbSize[0], p.jpegThumbSize[1]); 1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegQuality, p.jpegThumbQuality); 200836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation); 2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS tags %s\n", 202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsEnabled ? "enabled" : "disabled"); 203836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (p.gpsEnabled) { 2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 205836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[0], p.gpsCoordinates[1], 206836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[2]); 2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS timestamp: %lld\n", 208836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsTimestamp); 2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS processing method: %s\n", 210836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsProcessingMethod.string()); 2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" White balance mode: "); 214836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.wbMode) { 2152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO) 2162d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT) 2172d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT) 2182d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT) 2192d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT) 2202d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT) 2212d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT) 2222d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE) 2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Effect mode: "); 227836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.effectMode) { 2282d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF) 2292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO) 2302d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE) 2312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE) 2322d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA) 2332d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE) 2342d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD) 2352d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD) 2362d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA) 2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Antibanding mode: "); 241836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.antibandingMode) { 2422d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO) 2432d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF) 2442d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ) 2452d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ) 2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Scene mode: "); 250836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.sceneMode) { 2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append("AUTO\n"); break; 2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Flash mode: "); 272836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.flashMode) { 2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focus mode: "); 283836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.focusMode) { 2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 2857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 2877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 2887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 2907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 2917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 2927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 295f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala result.append(" Focus state: "); 296f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala switch (p.focusState) { 297f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE) 298f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN) 299f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED) 300f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN) 301f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED) 302f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) 303f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala default: result.append("UNKNOWN\n"); 304f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala } 305f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala 3067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focusing areas:\n"); 307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.focusingAreas.size(); i++) { 3087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 309836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].left, 310836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].top, 311836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].right, 312836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].bottom, 313836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].weight); 3147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 3157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Exposure compensation index: %d\n", 317836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.exposureCompensation); 3187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" AE lock %s, AWB lock %s\n", 320836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoExposureLock ? "enabled" : "disabled", 321836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoWhiteBalanceLock ? "enabled" : "disabled" ); 3227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Metering areas:\n"); 324836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.meteringAreas.size(); i++) { 3257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 326836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].left, 327836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].top, 328836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].right, 329836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].bottom, 330836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].weight); 3317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 3327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 333836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Zoom index: %d\n", p.zoom); 334836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Video size: %d x %d\n", p.videoWidth, 335836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoHeight); 3367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Recording hint is %s\n", 338836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.recordingHint ? "set" : "not set"); 3397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Video stabilization is %s\n", 341836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoStabilization ? "enabled" : "disabled"); 3427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current streams:\n"); 34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.appendFormat(" Preview stream ID: %d\n", 34569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala getPreviewStreamId()); 346177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala result.appendFormat(" Capture stream ID: %d\n", 34769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala getCaptureStreamId()); 34869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.appendFormat(" Recording stream ID: %d\n", 34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala getRecordingStreamId()); 350596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala 351596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala result.append(" Quirks for this camera:\n"); 352596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala bool haveQuirk = false; 353596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala if (p.quirks.triggerAfWithAuto) { 354596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala result.appendFormat(" triggerAfWithAuto\n"); 355596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala haveQuirk = true; 356596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala } 357596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala if (p.quirks.useZslFormat) { 358596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala result.appendFormat(" useZslFormat\n"); 359596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala haveQuirk = true; 360596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala } 3613a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin if (p.quirks.meteringCropRegion) { 3623a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin result.appendFormat(" meteringCropRegion\n"); 3633a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin haveQuirk = true; 3643a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin } 365596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala if (!haveQuirk) { 366596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala result.appendFormat(" none\n"); 367596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala } 368596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala 36943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala write(fd, result.string(), result.size()); 3703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 37143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor->dump(fd, args); 372428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala 37369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureSequencer->dump(fd, args); 37469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 375c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mFrameProcessor->dump(fd, args); 376c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 3772274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala mZslProcessor->dump(fd, args); 3782274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala 379a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin return dumpDevice(fd, args); 3807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM 38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 38261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 38361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface 38461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 38561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() { 386a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 387a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 388617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala 389617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala // Allow both client and the media server to disconnect at all times 390617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala int callingPid = getCallingPid(); 391617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala if (callingPid != mClientPid && callingPid != mServicePid) return; 392ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 393f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mDevice == 0) return; 394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3957adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGV("Camera %d: Shutting down", mCameraId); 3967adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 39702f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala /** 39802f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala * disconnect() cannot call any methods that might need to promote a 39902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala * wp<Camera2Client>, since disconnect can be called from the destructor, at 40002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala * which point all such promotions will fail. 40102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala */ 40202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala 403e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala stopPreviewL(); 4046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4057adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala { 4067adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala SharedParameters::Lock l(mParameters); 407617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala if (l.mParameters.state == Parameters::DISCONNECTED) return; 4087adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala l.mParameters.state = Parameters::DISCONNECTED; 4097adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala } 4107adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 41143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor->deletePreviewStream(); 41243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor->deleteRecordingStream(); 41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mJpegProcessor->deleteStream(); 4142863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala mCallbackProcessor->deleteStream(); 4157d8b92bf72194896363ceef97e12a52ac1bb1e5cEino-Ville Talvala mZslProcessor->deleteStream(); 4167d8b92bf72194896363ceef97e12a52ac1bb1e5cEino-Ville Talvala 417254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala mStreamingProcessor->requestExit(); 4187adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mFrameProcessor->requestExit(); 4197adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mCaptureSequencer->requestExit(); 4207adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mJpegProcessor->requestExit(); 4212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessorThread->requestExit(); 4227adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mCallbackProcessor->requestExit(); 4237adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 4247adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGV("Camera %d: Waiting for threads", mCameraId); 4257adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 426254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala mStreamingProcessor->join(); 4277adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mFrameProcessor->join(); 4287adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mCaptureSequencer->join(); 4297adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mJpegProcessor->join(); 4302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessorThread->join(); 4317adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mCallbackProcessor->join(); 4327adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 4337adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGV("Camera %d: Disconnecting device", mCameraId); 4347adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 4357adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mDevice->disconnect(); 4367adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 4373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mDevice.clear(); 4388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 43961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala CameraService::Client::disconnect(); 44061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 44161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 44261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) { 443a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4449e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 445a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 446ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != 0 && getCallingPid() != mClientPid) { 4489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Connection attempt from pid %d; " 4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "current locked to pid %d", __FUNCTION__, 4509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraId, getCallingPid(), mClientPid); 4519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return BAD_VALUE; 4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 456a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin mRemoteCallback = client; 457a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin mSharedCameraCallbacks = client; 4589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 46061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 46161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 46261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() { 463a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4649e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 465a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 468ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == 0) { 4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != getCallingPid()) { 4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 4769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 4789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 48161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 48261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 48361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() { 484a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4859e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 486a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 4879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 489ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == getCallingPid()) { 491cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala SharedParameters::Lock l(mParameters); 492cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala if (l.mParameters.state == Parameters::RECORD || 493cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 494cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala ALOGD("Not allowed to unlock camera during recording."); 495cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala return INVALID_OPERATION; 496cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala } 4979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = 0; 498a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin mRemoteCallback.clear(); 499a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin mSharedCameraCallbacks.clear(); 5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 5019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 5049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 50661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 50761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 5086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay( 5096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<Surface>& surface) { 510a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5119e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 512a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 5133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 5143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 515ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 5166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 5176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 5186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surface != 0) { 519a6843669d4da47755ce97fb85389d4d1c52b8197Mathias Agopian binder = surface->getIGraphicBufferProducer()->asBinder(); 5206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = surface; 5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 52336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder,window); 52461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 52561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture( 527484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) { 528a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5299e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 530a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 5313a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 5323a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 533ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 5346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 5356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 536484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden if (bufferProducer != 0) { 537484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden binder = bufferProducer->asBinder(); 538b1e7cd156ca3e1747374e0d20cdd1ce467210453Mathias Agopian window = new Surface(bufferProducer); 5396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 54036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder, window); 5416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 5426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 54336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder, 544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala sp<ANativeWindow> window) { 545a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 5476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (binder == mPreviewSurface) { 5499e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: New window is same as old window", 5509e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId); 5516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return NO_ERROR; 5526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 554c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala Parameters::State state; 555c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala { 556c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala SharedParameters::Lock l(mParameters); 557c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala state = l.mParameters.state; 558c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala } 559c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala switch (state) { 5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 5649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 566c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala Parameters::getStateName(state)); 5679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 5709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK 5719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 5739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Already running preview - need to stop and create a new stream 57402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala res = stopStream(); 57502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (res != OK) { 57602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Unable to stop preview to swap windows: %s (%d)", 57702f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 57802f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala return res; 57902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 580c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 5819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 5839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 584bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala mPreviewSurface = binder; 58543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->setPreviewWindow(window); 58643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 58743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Unable to set new preview window: %s (%d)", 58843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 58943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 59043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 591bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 592c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) { 593c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala SharedParameters::Lock l(mParameters); 594c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala l.mParameters.state = state; 5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startPreviewL(l.mParameters, false); 5966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 59961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 60061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 60161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) { 602a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag); 604a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 605ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin 606228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala setPreviewCallbackFlagL(l.mParameters, flag); 610228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 611228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters ¶ms, int flag) { 613228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res = OK; 614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) { 615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: setting oneshot", __FUNCTION__); 616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewCallbackOneShot = true; 617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (params.previewCallbackFlags != (uint32_t)flag) { 619228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewCallbackFlags = flag; 620228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch(params.state) { 6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 622228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startPreviewL(params, true); 623228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 6252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 626228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startRecordingL(params, true); 627228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 628228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala default: 629228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 630228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 631228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 632228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to refresh request in state %s", 6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 6342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 635228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 637228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 63861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 63961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 64061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() { 641a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6429e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 643a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 6443a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 6462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 6472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startPreviewL(l.mParameters, false); 648d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 649ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 650228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters ¶ms, bool restart) { 651d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 6526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 6530cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 6540cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart); 6550cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 656411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala if ( (params.state == Parameters::PREVIEW || 657411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala params.state == Parameters::RECORD || 658411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala params.state == Parameters::VIDEO_SNAPSHOT) 659411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala && !restart) { 660411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala // Succeed attempt to re-enter a streaming state 661411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala ALOGI("%s: Camera %d: Preview already active, ignoring restart", 662411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala __FUNCTION__, mCameraId); 66371d6454cc20b7a3bbe0cfd375c778c5fcc54795aAlex Ray return OK; 66471d6454cc20b7a3bbe0cfd375c778c5fcc54795aAlex Ray } 66571d6454cc20b7a3bbe0cfd375c778c5fcc54795aAlex Ray if (params.state > Parameters::PREVIEW && !restart) { 6664ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGE("%s: Can't start preview in state %s", 6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 6694ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return INVALID_OPERATION; 6704ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 6716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 67243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (!mStreamingProcessor->haveValidPreviewWindow()) { 6732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 6746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 6756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::STOPPED; 6779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 67843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->updatePreviewStream(params); 679be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 680be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 681be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 682be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 68443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 685a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // We could wait to create the JPEG output stream until first actual use 686a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // (first takePicture call). However, this would substantially increase the 687a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // first capture latency on HAL3 devices, and potentially on some HAL2 688a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // devices. So create it unconditionally at preview start. As a drawback, 689a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // this increases gralloc memory consumption for applications that don't 690a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // ever take a picture. 691a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // TODO: Find a better compromise, though this likely would involve HAL 692a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // changes. 693a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala res = updateProcessorStream(mJpegProcessor, params); 694a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala if (res != OK) { 695a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala ALOGE("%s: Camera %d: Can't pre-configure still image " 696a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala "stream: %s (%d)", 697a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 698a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala return res; 699a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala } 700a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala 70143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Vector<uint8_t> outputStreams; 702228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool callbacksEnabled = params.previewCallbackFlags & 703228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 704228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 7052863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala res = mCallbackProcessor->updateStream(params); 706228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 707228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 708228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 709228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 710228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 71143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getCallbackStreamId()); 712228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 713f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala if (params.zslMode && !params.recordingHint) { 7145282713a976184e41451315f1286d8075b257d58Igor Murashkin res = updateProcessorStream(mZslProcessor, params); 71569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 71669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)", 71769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 71869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 71969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 72043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getZslStreamId()); 72169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 7226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 72343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getPreviewStreamId()); 72443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 725f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala if (!params.recordingHint) { 72643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (!restart) { 72743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->updatePreviewRequest(params); 728f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala if (res != OK) { 72943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Can't set up preview request: " 73043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, 73143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala strerror(-res), res); 732f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala return res; 733f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala } 734f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala } 73543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW, 73643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams); 737f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala } else { 73843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (!restart) { 73943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->updateRecordingRequest(params); 74043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 74143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Can't set up preview request with " 74243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala "record hint: %s (%d)", __FUNCTION__, mCameraId, 74343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala strerror(-res), res); 74443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 74543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 74643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 74743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 74843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams); 749be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 750be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 75143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)", 752be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 7546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::PREVIEW; 7576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 75861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 75961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 76061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() { 761a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 7629e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 763a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 7643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 7653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 76636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala stopPreviewL(); 767ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala} 768ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 76936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() { 770ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala ATRACE_CALL(); 7714c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala status_t res; 772e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds 7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::State state; 774228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala { 7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala state = l.mParameters.state; 777228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 778228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 779228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (state) { 7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 78148af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala // Nothing to do. 782d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 784e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 786e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout); 787e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala // no break 7882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 7892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 79002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala res = stopStream(); 79102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (res != OK) { 79202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)", 79302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 79402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 7954c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = mDevice->waitUntilDrained(); 7964c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res != OK) { 7974c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 7984c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7994c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 800228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // no break 8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: { 8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala commandStopFaceDetectionL(l.mParameters); 805d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 806228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 807d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 808d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 809228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala state); 810d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 81161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 81261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 81361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() { 814a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 815a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 8163a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 8173a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return false; 8183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return l.mParameters.state == Parameters::PREVIEW; 82161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 82261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 82361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 824a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 825a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 8263a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 8273a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 8283a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 8312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 83378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Can't be called in state %s", 8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 83678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 83778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala default: 83878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala // OK 83978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala break; 84078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 84178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.storeMetadataInBuffers = enabled; 84378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 84478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return OK; 84561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 84661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 84761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() { 848a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 8499e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 850a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 8519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 8523a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 8532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 854228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 8552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startRecordingL(l.mParameters, false); 856228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 8573a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 858228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters ¶ms, bool restart) { 859228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res; 8600cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 8610cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart); 8620cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 863228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (params.state) { 8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 865228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startPreviewL(params, false); 8669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) return res; 8679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 8699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Ready to go 8709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 8722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 873228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // OK to call this when recording is already on, just skip unless 874228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // we're looking to restart 875228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!restart) return OK; 8769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 8779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 8789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't start recording in state %s", 8792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 8802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 8819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 8829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 884228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!params.storeMetadataInBuffers) { 88578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording only supported in metadata mode, but " 88678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "non-metadata recording mode requested!", __FUNCTION__, 88778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mCameraId); 88878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 88978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 89078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 89143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (!restart) { 89243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 89343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor->updateRecordingRequest(params); 89443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 89543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 89643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 89743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 89843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 89943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 90033578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala 90182db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin res = updateProcessorStream< 90282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin StreamingProcessor, 90382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin &StreamingProcessor::updateRecordingStream>(mStreamingProcessor, 90482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin params); 9059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 9069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 9079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 9089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 9099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 91043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 91143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Vector<uint8_t> outputStreams; 912228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool callbacksEnabled = params.previewCallbackFlags & 913228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 914228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 9152863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala res = mCallbackProcessor->updateStream(params); 916228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 917228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 918228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 919228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 920228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 92143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getCallbackStreamId()); 922228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 92343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getPreviewStreamId()); 92443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getRecordingStreamId()); 9259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 92643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 92743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams); 9289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 92943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)", 9309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 9319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 9329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 9339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 9342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state < Parameters::RECORD) { 9352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::RECORD; 936228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 9379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 9389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 93961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 94061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 94161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() { 942a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 9439e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 944a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 946228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 9479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 9483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 9493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 9502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 9529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to stop 9539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 9542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 9552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 9562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 9572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 9589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 9599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop recording in state %s", 9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 9629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 9639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 9649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 96533578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 96633578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala 967f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala res = startPreviewL(l.mParameters, true); 9689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 969f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to return to preview", 970f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala __FUNCTION__, mCameraId); 9719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 97261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 97361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 97461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() { 975a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 976a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 9778da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return false; 9793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 9808da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong return recordingEnabledL(); 9818da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong} 9828da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9838da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() { 9848da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong ATRACE_CALL(); 9852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 9868da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return (l.mParameters.state == Parameters::RECORD 9882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || l.mParameters.state == Parameters::VIDEO_SNAPSHOT); 98961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 99061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 99161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 992a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 993a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 9943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 99530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 99643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor->releaseRecordingFrame(mem); 99761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 99861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 99961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() { 1000a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1001a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 1002c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 10033a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 10043a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 10053a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 1006174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 1007f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala bool notifyImmediately = false; 1008f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala bool notifySuccess = false; 1009174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 10102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 10114c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (l.mParameters.state < Parameters::PREVIEW) { 10124c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return INVALID_OPERATION; 10134c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 10144c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 10155b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin /** 10165b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin * If the camera does not support auto-focus, it is a no-op and 10175b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin * onAutoFocus(boolean, Camera) callback will be called immediately 10185b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin * with a fake value of success set to true. 10199454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala * 10209454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala * Similarly, if focus mode is set to INFINITY, there's no reason to 10219454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala * bother the HAL. 10225b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin */ 10239454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED || 10249454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) { 1025f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala notifyImmediately = true; 1026f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala notifySuccess = true; 1027f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala } 1028f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala /** 1029f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala * If we're in CAF mode, and AF has already been locked, just fire back 1030f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala * the callback right away; the HAL would not send a notification since 1031f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala * no state change would happen on a AF trigger. 1032f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala */ 1033f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE || 1034f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) && 1035f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) { 1036f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala notifyImmediately = true; 1037f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala notifySuccess = true; 1038f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala } 1039f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala /** 1040f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala * Send immediate notification back to client 1041f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala */ 1042f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala if (notifyImmediately) { 1043a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 1044a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 1045a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS, 1046f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala notifySuccess ? 1 : 0, 0); 10475b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin } 10485b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin return OK; 10495b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin } 1050f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala /** 1051f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala * Handle quirk mode for AF in scene modes 1052f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala */ 10534c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala if (l.mParameters.quirks.triggerAfWithAuto && 10544c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED && 105565dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO && 105665dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala !l.mParameters.focusingAreas[0].isEmpty()) { 10574c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala ALOGV("%s: Quirk: Switching from focusMode %d to AUTO", 10584c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala __FUNCTION__, l.mParameters.focusMode); 10594c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.shadowFocusMode = l.mParameters.focusMode; 10604c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 10614c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala updateRequests(l.mParameters); 10624c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala } 10634c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala 10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter; 10652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala triggerId = l.mParameters.currentAfTriggerId; 1066174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 10674c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala syncWithDevice(); 1068174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1069174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerAutofocus(triggerId); 1070174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 10716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 107261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 107361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 107461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() { 1075a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1076a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 1077c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 10783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 10793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 10803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 1081174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 1082174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 10832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 10849454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala // Canceling does nothing in FIXED or INFINITY modes 10859454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED || 10869454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) { 10879454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala return OK; 10889454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala } 10892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala triggerId = ++l.mParameters.afTriggerCounter; 10904c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala 10914c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala // When using triggerAfWithAuto quirk, may need to reset focus mode to 109265dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala // the real state at this point. No need to cancel explicitly if 109365dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala // changing the AF mode. 10944c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) { 10954c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__, 10964c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.shadowFocusMode); 10974c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.focusMode = l.mParameters.shadowFocusMode; 10984c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID; 10994c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala updateRequests(l.mParameters); 110065dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala 110165dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala return OK; 11024c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala } 1103174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 11044c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala syncWithDevice(); 1105174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1106174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerCancelAutofocus(triggerId); 1107174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 11086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 110961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 111061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 111172421521fd06787a407d06966e11f17b86900d2aBen Murdochstatus_t Camera2Client::takePicture(int msgType) { 1112a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1113a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 1114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 11153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1116d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 11171d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala { 11181d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala SharedParameters::Lock l(mParameters); 11191d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala switch (l.mParameters.state) { 11201d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::DISCONNECTED: 11211d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::STOPPED: 11221d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 11231d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 112469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mCameraId); 11251d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala return INVALID_OPERATION; 11261d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::PREVIEW: 11271d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala // Good to go for takePicture 11281d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala res = commandStopFaceDetectionL(l.mParameters); 11291d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala if (res != OK) { 11301d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop face detection for still capture", 11311d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala __FUNCTION__, mCameraId); 11321d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala return res; 11331d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala } 11341d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala l.mParameters.state = Parameters::STILL_CAPTURE; 11351d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala break; 11361d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::RECORD: 11371d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala // Good to go for video snapshot 11381d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala l.mParameters.state = Parameters::VIDEO_SNAPSHOT; 11391d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala break; 11401d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::STILL_CAPTURE: 11411d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 11421d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala ALOGE("%s: Camera %d: Already taking a picture", 11431d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala __FUNCTION__, mCameraId); 11441d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala return INVALID_OPERATION; 11451d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala } 1146d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 11471d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId); 1148d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 11495282713a976184e41451315f1286d8075b257d58Igor Murashkin res = updateProcessorStream(mJpegProcessor, l.mParameters); 11501d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala if (res != OK) { 11511d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 11521d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 11531d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala return res; 11541d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala } 1155228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 11568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 11574c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala // Need HAL to have correct settings before (possibly) triggering precapture 11584c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala syncWithDevice(); 11594c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 1160786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin res = mCaptureSequencer->startCapture(msgType); 1161d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 116269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to start capture: %s (%d)", 1163d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1164d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1165d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 116669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 116761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 116861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 116961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) { 1170a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1171c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 1172a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala status_t res; 11743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 11753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = l.mParameters.set(params); 11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) return res; 11809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 11812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = updateRequests(l.mParameters); 11828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 11838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 118461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 1185f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 118661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const { 1187a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1188c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 1189a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 11903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return String8(); 1191ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 11922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::ReadLock l(mParameters); 1193ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 1194c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return l.mParameters.get(); 119561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 119661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 119761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1198a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1199a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 12003a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 12013a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1202c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1203c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1204c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala cmd, arg1, arg2); 1205c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 120636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala switch (cmd) { 120736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_SMOOTH_ZOOM: 120836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartSmoothZoomL(); 120936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_STOP_SMOOTH_ZOOM: 121036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStopSmoothZoomL(); 121136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_DISPLAY_ORIENTATION: 121236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetDisplayOrientationL(arg1); 121336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_SHUTTER_SOUND: 121436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableShutterSoundL(arg1 == 1); 121536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PLAY_RECORDING_SOUND: 121636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPlayRecordingSoundL(); 121736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_FACE_DETECTION: 121836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartFaceDetectionL(arg1); 1219228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case CAMERA_CMD_STOP_FACE_DETECTION: { 12202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return commandStopFaceDetectionL(l.mParameters); 1222228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 122336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG: 122436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableFocusMoveMsgL(arg1 == 1); 122536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PING: 122636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPingL(); 122736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT: 122836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetVideoBufferCountL(arg1); 122936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala default: 123036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unknown command %d (arguments %d, %d)", 123136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, cmd, arg1, arg2); 1232c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 123336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 123436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 123536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 123636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() { 123736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 123836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 123936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 124036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 124136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() { 124236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 124336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 124436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 124536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 124636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) { 12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int transform = Parameters::degToTransform(degrees, 124836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 124936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (transform == -1) { 125036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as display orientation value", 125136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, mCameraId, degrees); 125236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return BAD_VALUE; 125336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 12542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (transform != l.mParameters.previewTransform && 125643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala getPreviewStreamId() != NO_STREAM) { 125743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mDevice->setStreamTransform(getPreviewStreamId(), transform); 125836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 12592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.previewTransform = transform; 126036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 126136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 126236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 126336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) { 12642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 126536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (enable) { 12662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.playShutterSound = true; 1267c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return OK; 126836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1269983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 127036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound may not be allowed. In that case only 127136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // allow the mediaserver process to disable the sound. 127236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala char value[PROPERTY_VALUE_MAX]; 127336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala property_get("ro.camera.sound.forced", value, "0"); 127436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (strncmp(value, "0", 2) != 0) { 127536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound is not allowed. Deny if the current 127636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // process is not mediaserver. 127736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (getCallingPid() != getpid()) { 127836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("Failed to disable shutter sound. Permission denied (pid %d)", 127936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala getCallingPid()); 128036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return PERMISSION_DENIED; 1281983cf231ab2d176a14595cdae46ff1b0c239af47James Dong } 128236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1283983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.playShutterSound = false; 128536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 128636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 1287983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 128836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() { 128936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 129036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 129136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 129236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1293ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinstatus_t Camera2Client::commandStartFaceDetectionL(int /*type*/) { 12948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Starting face detection", 12958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 12968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 13038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot start face detection without preview active", 13048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 13058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return INVALID_OPERATION; 13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 13072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 13082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 13098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // Good to go for starting face detect 13108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala break; 13118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 13128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // Ignoring type 13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.fastInfo.bestFaceDetectMode == 13142d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) { 13158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Face detection not supported", 13168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 1317ea49f4b4ba9d182fd8a74c74d16590cb65f3a5f1Ziv Hendel return BAD_VALUE; 13188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 13192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFaceDetect) return OK; 13208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.enableFaceDetect = true; 13228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = updateRequests(l.mParameters); 13248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 13258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 132636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 132736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1328228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters ¶ms) { 13298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res = OK; 13308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Stopping face detection", 13318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 13328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1333228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!params.enableFaceDetect) return OK; 13348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1335228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.enableFaceDetect = false; 13368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 13372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state == Parameters::PREVIEW 13382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || params.state == Parameters::RECORD 13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || params.state == Parameters::VIDEO_SNAPSHOT) { 1340228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateRequests(params); 13418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 13428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 13438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 134436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 134536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 134636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) { 13472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 13482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.enableFocusMoveMessages = enable; 1349174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 135036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 135136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 135236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 135336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() { 135436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Always ping back if access is proper and device is alive 13552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 13562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.state != Parameters::DISCONNECTED) { 1357983cf231ab2d176a14595cdae46ff1b0c239af47James Dong return OK; 135836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } else { 135936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return NO_INIT; 136036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 136136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 136236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 136336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) { 13648da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong if (recordingEnabledL()) { 136536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting video buffer count after " 136636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala "recording was started", __FUNCTION__, mCameraId); 136736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return INVALID_OPERATION; 1368c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1369c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 137043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return mStreamingProcessor->setRecordingBufferCount(count); 137161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 137261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 13733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */ 1374160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) { 1375160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autofocus state now %d, last trigger %d", 1376160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1377174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendCompletedMessage = false; 1378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendMovingMessage = false; 1379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1380174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool success = false; 1381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool afInMotion = false; 1382174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 13832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 1384f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala l.mParameters.focusState = newState; 13852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.focusMode) { 1386174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 1387174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 1388174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for the current AF 1389174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // trigger. For example, if cancel was called in between, or if we 1390174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // already sent a notification about this AF call. 13912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (triggerId != l.mParameters.currentAfTriggerId) break; 1392174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1393174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1394174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1395174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1396174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1397174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 13982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = -1; 1399174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1400174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 1401174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Just starting focusing, ignore 1402174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1403174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1406174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1407174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Unexpected in AUTO/MACRO mode 1408174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d", 1409174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, newState); 1410174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1411174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1412174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1413174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1414174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1415174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1416174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1417174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1418174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1419174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1420174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for 1421174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // the current AF trigger. For example, if cancel was 1422174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // called in between, or if we already sent a 1423174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // notification about this AF call. 1424174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Send both a 'AF done' callback and a 'AF move' callback 14252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (triggerId != l.mParameters.currentAfTriggerId) break; 1426174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 1427174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 14282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages && 14292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion) { 1430174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1431174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = -1; 1433174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1434174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1435174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Cancel was called, or we switched state; care if 1436174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // currently moving 1437174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages && 14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion) { 1440174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1441174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1442174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1443174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1444174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Start passive scan, inform upstream 1445174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = true; 1446174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1447174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1448174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Stop passive scan, inform upstream 14492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages) { 1450174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1451174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1452174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1453174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 14542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion = afInMotion; 1455174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1456174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 1457174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 1458174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 1459174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1460174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) { 1461a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala ALOGE("%s: Unexpected AF state change %d " 1462a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala "(ID %d) in focus mode %d", 1463a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala __FUNCTION__, newState, triggerId, 1464a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala l.mParameters.focusMode); 1465174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1466174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1467174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1468174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (sendMovingMessage) { 1469a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 1470a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 1471a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE, 14728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala afInMotion ? 1 : 0, 0); 14738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1474174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1475603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala if (sendCompletedMessage) { 1476a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 1477a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 1478a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS, 1479a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala success ? 1 : 0, 0); 14808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1481603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala } 1482160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1483160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1484160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) { 1485160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autoexposure state now %d, last trigger %d", 1486160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 148769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureSequencer->notifyAutoExposure(newState, triggerId); 1488160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1489160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1490a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() { 1491a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala return mParameters; 1492c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 1493c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 149469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const { 149543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return mStreamingProcessor->getPreviewStreamId(); 149669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 149769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 149869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const { 149969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return mJpegProcessor->getStreamId(); 150069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 150169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 150269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const { 150369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return mCallbackProcessor->getStreamId(); 150469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 150569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 150669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const { 150743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return mStreamingProcessor->getRecordingStreamId(); 150869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 150969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 151069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getZslStreamId() const { 151169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return mZslProcessor->getStreamId(); 151269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 151369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15144c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId, 15154c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala wp<camera2::FrameProcessor::FilteredListener> listener) { 15164c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return mFrameProcessor->registerListener(minId, maxId, listener); 15174c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala} 15184c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 15194c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId, 152069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala wp<camera2::FrameProcessor::FilteredListener> listener) { 15214c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return mFrameProcessor->removeListener(minId, maxId, listener); 152269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 152369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15244c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::stopStream() { 15254c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return mStreamingProcessor->stopStream(); 152669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 152769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15284c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart; 15294c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd; 15304c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart; 15314c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd; 15324c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart; 15334c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd; 153469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */ 15363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1537f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters ¶ms) { 15388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 15398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15400cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state); 15410cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 15424c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = mStreamingProcessor->incrementStreamingIds(); 15434c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res != OK) { 15444c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)", 15454c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15464c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return res; 15474c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 15484c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 154943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->updatePreviewRequest(params); 15508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 15528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 155543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->updateRecordingRequest(params); 15568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 15588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state == Parameters::PREVIEW) { 1563f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala res = startPreviewL(params, true); 15648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 15668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (params.state == Parameters::RECORD || 15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state == Parameters::VIDEO_SNAPSHOT) { 157143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = startRecordingL(params, true); 15728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 15748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 15808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height, 1583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala int format, int stride) { 1584228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (format) { 1585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 1586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 1588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 3 / 2; 1589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 1590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: { // YV12 1592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t ySize = stride * height; 1593f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala size_t uvStride = (stride / 2 + 0xF) & ~0xF; 1594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t uvSize = uvStride * height / 2; 1595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return ySize + uvSize * 2; 1596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 1597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 1598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 1600228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 4; 1601228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 1602228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala default: 1604228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 1605228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, format); 1606228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return 0; 1607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 1608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 16098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 16104c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::syncWithDevice() { 16114c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ATRACE_CALL(); 1612b66e9d6bcc45fabd1a8490d968d58cac8e1ac70cEino-Ville Talvala const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms 16134c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala status_t res; 16144c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 16154c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala int32_t activeRequestId = mStreamingProcessor->getActiveRequestId(); 16164c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (activeRequestId == 0) return OK; 16174c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 16184c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout); 16194c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res == TIMED_OUT) { 16204c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Camera %d: Timed out waiting sync with HAL", 16214c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala __FUNCTION__, mCameraId); 16224c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } else if (res != OK) { 16234c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Camera %d: Error while waiting to sync with HAL", 16244c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala __FUNCTION__, mCameraId); 16254c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 16264c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return res; 16274c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala} 16284c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 16295282713a976184e41451315f1286d8075b257d58Igor Murashkintemplate <typename ProcessorT> 16305282713a976184e41451315f1286d8075b257d58Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor, 16315282713a976184e41451315f1286d8075b257d58Igor Murashkin camera2::Parameters params) { 163282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin // No default template arguments until C++11, so we need this overload 163382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>( 163482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin processor, params); 163582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin} 163682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin 163782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkintemplate <typename ProcessorT, 163882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin status_t (ProcessorT::*updateStreamF)(const Parameters &)> 163982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor, 164082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin Parameters params) { 16415282713a976184e41451315f1286d8075b257d58Igor Murashkin status_t res; 16425282713a976184e41451315f1286d8075b257d58Igor Murashkin 164382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin // Get raw pointer since sp<T> doesn't have operator->* 164482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin ProcessorT *processorPtr = processor.get(); 164582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin res = (processorPtr->*updateStreamF)(params); 16465282713a976184e41451315f1286d8075b257d58Igor Murashkin 16475282713a976184e41451315f1286d8075b257d58Igor Murashkin /** 16485282713a976184e41451315f1286d8075b257d58Igor Murashkin * Can't update the stream if it's busy? 16495282713a976184e41451315f1286d8075b257d58Igor Murashkin * 16505282713a976184e41451315f1286d8075b257d58Igor Murashkin * Then we need to stop the device (by temporarily clearing the request 16515282713a976184e41451315f1286d8075b257d58Igor Murashkin * queue) and then try again. Resume streaming once we're done. 16525282713a976184e41451315f1286d8075b257d58Igor Murashkin */ 16535282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res == -EBUSY) { 16545282713a976184e41451315f1286d8075b257d58Igor Murashkin res = mStreamingProcessor->togglePauseStream(/*pause*/true); 16555282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res != OK) { 16565282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)", 16575282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 16585282713a976184e41451315f1286d8075b257d58Igor Murashkin } 16595282713a976184e41451315f1286d8075b257d58Igor Murashkin 16605282713a976184e41451315f1286d8075b257d58Igor Murashkin res = mDevice->waitUntilDrained(); 16615282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res != OK) { 16625282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 16635282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 16645282713a976184e41451315f1286d8075b257d58Igor Murashkin } 16655282713a976184e41451315f1286d8075b257d58Igor Murashkin 166682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin res = (processorPtr->*updateStreamF)(params); 16675282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res != OK) { 16685282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Failed to update processing stream " 16695282713a976184e41451315f1286d8075b257d58Igor Murashkin " despite having halted streaming first: %s (%d)", 16705282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 16715282713a976184e41451315f1286d8075b257d58Igor Murashkin } 16725282713a976184e41451315f1286d8075b257d58Igor Murashkin 16735282713a976184e41451315f1286d8075b257d58Igor Murashkin res = mStreamingProcessor->togglePauseStream(/*pause*/false); 16745282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res != OK) { 16755282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)", 16765282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 16775282713a976184e41451315f1286d8075b257d58Igor Murashkin } 16785282713a976184e41451315f1286d8075b257d58Igor Murashkin } 16795282713a976184e41451315f1286d8075b257d58Igor Murashkin 16805282713a976184e41451315f1286d8075b257d58Igor Murashkin return res; 16815282713a976184e41451315f1286d8075b257d58Igor Murashkin} 1682a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin 168361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android 1684