Camera2Client.cpp revision 9454a9710b13c7d9262fe1cbd910235a3cd35f20
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); 10543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 10671381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin mFrameProcessor = new FrameProcessor(mDevice, this); 107852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala threadName = String8::format("C2-%d-FrameProc", 10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCameraId); 10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mFrameProcessor->run(threadName.string()); 11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureSequencer = new CaptureSequencer(this); 112852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala threadName = String8::format("C2-%d-CaptureSeq", 11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCameraId); 11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureSequencer->run(threadName.string()); 11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mJpegProcessor = new JpegProcessor(this, mCaptureSequencer); 117852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala threadName = String8::format("C2-%d-JpegProc", 118177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala mCameraId); 11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mJpegProcessor->run(threadName.string()); 120177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala 1212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin switch (mDeviceVersion) { 1222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case CAMERA_DEVICE_API_VERSION_2_0: { 1232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<ZslProcessor> zslProc = 1242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin new ZslProcessor(this, mCaptureSequencer); 1252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessor = zslProc; 1262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessorThread = zslProc; 1272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 1282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case CAMERA_DEVICE_API_VERSION_3_0:{ 1302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<ZslProcessor3> zslProc = 1312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin new ZslProcessor3(this, mCaptureSequencer); 1322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessor = zslProc; 1332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessorThread = zslProc; 1342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 1352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin default: 1372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 1382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 139852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala threadName = String8::format("C2-%d-ZslProc", 14069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCameraId); 1412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessorThread->run(threadName.string()); 142177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala 1432863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala mCallbackProcessor = new CallbackProcessor(this); 144852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala threadName = String8::format("C2-%d-CallbkProc", 14569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCameraId); 14669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCallbackProcessor->run(threadName.string()); 1472863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala 148f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (gLogLevel >= 1) { 149f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 150f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCameraId); 1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGD("%s", l.mParameters.paramsFlattened.string()); 152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 154f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 15561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 15661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 15761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() { 158a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 15902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGV("~Camera2Client"); 1604ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 161f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDestructionStarted = true; 162f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 163617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala disconnect(); 164c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 16569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGI("Camera %d: Closed", mCameraId); 16661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 16761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 16861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) { 169611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala String8 result; 1707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala result.appendFormat("Client2[%d] (%p) Client: %s PID: %d, dump:\n", 171611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mCameraId, 172a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin getRemoteCallback()->asBinder().get(), 1737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala String8(mClientPackageName).string(), 174611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mClientPid); 1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" State: "); 1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const Parameters& p = mParameters.unsafeAccess(); 179836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala result.append(Parameters::getStateName(p.state)); 1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1824ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append("\n Current parameters:\n"); 1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview size: %d x %d\n", 184836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewWidth, p.previewHeight); 1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview FPS range: %d - %d\n", 186836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFpsRange[0], p.previewFpsRange[1]); 1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview HAL pixel format: 0x%x\n", 188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFormat); 18911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala result.appendFormat(" Preview transform: %x\n", 190836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewTransform); 1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Picture size: %d x %d\n", 192836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.pictureWidth, p.pictureHeight); 1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 194836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegThumbSize[0], p.jpegThumbSize[1]); 1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 196836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegQuality, p.jpegThumbQuality); 197836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation); 1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS tags %s\n", 199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsEnabled ? "enabled" : "disabled"); 200836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (p.gpsEnabled) { 2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[0], p.gpsCoordinates[1], 203836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[2]); 2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS timestamp: %lld\n", 205836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsTimestamp); 2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS processing method: %s\n", 207836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsProcessingMethod.string()); 2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" White balance mode: "); 211836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.wbMode) { 2122d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO) 2132d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT) 2142d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT) 2152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT) 2162d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT) 2172d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT) 2182d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT) 2192d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE) 2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Effect mode: "); 224836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.effectMode) { 2252d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF) 2262d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO) 2272d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE) 2282d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE) 2292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA) 2302d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE) 2312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD) 2322d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD) 2332d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA) 2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Antibanding mode: "); 238836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.antibandingMode) { 2392d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO) 2402d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF) 2412d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ) 2422d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ) 2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Scene mode: "); 247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.sceneMode) { 2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append("AUTO\n"); break; 2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Flash mode: "); 269836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.flashMode) { 2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focus mode: "); 280836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.focusMode) { 2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 2837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 2857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 2877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 2887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 292f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala result.append(" Focus state: "); 293f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala switch (p.focusState) { 294f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE) 295f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN) 296f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED) 297f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN) 298f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED) 299f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) 300f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala default: result.append("UNKNOWN\n"); 301f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala } 302f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala 3037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focusing areas:\n"); 304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.focusingAreas.size(); i++) { 3057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 306836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].left, 307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].top, 308836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].right, 309836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].bottom, 310836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].weight); 3117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 3127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Exposure compensation index: %d\n", 314836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.exposureCompensation); 3157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" AE lock %s, AWB lock %s\n", 317836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoExposureLock ? "enabled" : "disabled", 318836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoWhiteBalanceLock ? "enabled" : "disabled" ); 3197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Metering areas:\n"); 321836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.meteringAreas.size(); i++) { 3227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 323836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].left, 324836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].top, 325836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].right, 326836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].bottom, 327836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].weight); 3287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 3297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 330836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Zoom index: %d\n", p.zoom); 331836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Video size: %d x %d\n", p.videoWidth, 332836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoHeight); 3337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Recording hint is %s\n", 335836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.recordingHint ? "set" : "not set"); 3367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Video stabilization is %s\n", 338836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoStabilization ? "enabled" : "disabled"); 3397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current streams:\n"); 34169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.appendFormat(" Preview stream ID: %d\n", 34269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala getPreviewStreamId()); 343177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala result.appendFormat(" Capture stream ID: %d\n", 34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala getCaptureStreamId()); 34569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.appendFormat(" Recording stream ID: %d\n", 34669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala getRecordingStreamId()); 347596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala 348596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala result.append(" Quirks for this camera:\n"); 349596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala bool haveQuirk = false; 350596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala if (p.quirks.triggerAfWithAuto) { 351596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala result.appendFormat(" triggerAfWithAuto\n"); 352596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala haveQuirk = true; 353596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala } 354596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala if (p.quirks.useZslFormat) { 355596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala result.appendFormat(" useZslFormat\n"); 356596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala haveQuirk = true; 357596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala } 3583a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin if (p.quirks.meteringCropRegion) { 3593a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin result.appendFormat(" meteringCropRegion\n"); 3603a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin haveQuirk = true; 3613a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin } 362596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala if (!haveQuirk) { 363596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala result.appendFormat(" none\n"); 364596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala } 365596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala 36643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala write(fd, result.string(), result.size()); 3673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 36843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor->dump(fd, args); 369428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala 37069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureSequencer->dump(fd, args); 37169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 372c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mFrameProcessor->dump(fd, args); 373c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 3742274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala mZslProcessor->dump(fd, args); 3752274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala 376a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin return dumpDevice(fd, args); 3777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM 37861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 37961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 38061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface 38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 38261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() { 383a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 384a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 385617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala 386617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala // Allow both client and the media server to disconnect at all times 387617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala int callingPid = getCallingPid(); 388617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala if (callingPid != mClientPid && callingPid != mServicePid) return; 389ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mDevice == 0) return; 391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3927adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGV("Camera %d: Shutting down", mCameraId); 3937adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 39402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala /** 39502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala * disconnect() cannot call any methods that might need to promote a 39602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala * wp<Camera2Client>, since disconnect can be called from the destructor, at 39702f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala * which point all such promotions will fail. 39802f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala */ 39902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala 400e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala stopPreviewL(); 4016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 4027adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala { 4037adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala SharedParameters::Lock l(mParameters); 404617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala if (l.mParameters.state == Parameters::DISCONNECTED) return; 4057adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala l.mParameters.state = Parameters::DISCONNECTED; 4067adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala } 4077adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 40843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor->deletePreviewStream(); 40943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor->deleteRecordingStream(); 41069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mJpegProcessor->deleteStream(); 4112863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala mCallbackProcessor->deleteStream(); 4127d8b92bf72194896363ceef97e12a52ac1bb1e5cEino-Ville Talvala mZslProcessor->deleteStream(); 4137d8b92bf72194896363ceef97e12a52ac1bb1e5cEino-Ville Talvala 4147adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mFrameProcessor->requestExit(); 4157adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mCaptureSequencer->requestExit(); 4167adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mJpegProcessor->requestExit(); 4172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessorThread->requestExit(); 4187adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mCallbackProcessor->requestExit(); 4197adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 4207adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGV("Camera %d: Waiting for threads", mCameraId); 4217adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 4227adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mFrameProcessor->join(); 4237adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mCaptureSequencer->join(); 4247adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mJpegProcessor->join(); 4252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslProcessorThread->join(); 4267adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mCallbackProcessor->join(); 4277adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 4287adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGV("Camera %d: Disconnecting device", mCameraId); 4297adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 4307adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mDevice->disconnect(); 4317adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 4323a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mDevice.clear(); 4338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 43461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala CameraService::Client::disconnect(); 43561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 43661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 43761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) { 438a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4399e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 440a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 441ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != 0 && getCallingPid() != mClientPid) { 4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Connection attempt from pid %d; " 4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "current locked to pid %d", __FUNCTION__, 4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraId, getCallingPid(), mClientPid); 4469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return BAD_VALUE; 4479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 451a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin mRemoteCallback = client; 452a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin mSharedCameraCallbacks = client; 4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 45561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 45661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 45761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() { 458a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4599e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 460a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 463ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == 0) { 4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != getCallingPid()) { 4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 47661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 47761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 47861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() { 479a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4809e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 481a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 4829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 4839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 484ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == getCallingPid()) { 486cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala SharedParameters::Lock l(mParameters); 487cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala if (l.mParameters.state == Parameters::RECORD || 488cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 489cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala ALOGD("Not allowed to unlock camera during recording."); 490cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala return INVALID_OPERATION; 491cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala } 4929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = 0; 493a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin mRemoteCallback.clear(); 494a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin mSharedCameraCallbacks.clear(); 4959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 4999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 50161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 50261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 5036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay( 5046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const sp<Surface>& surface) { 505a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5069e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 507a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 5083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 5093a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 510ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 5116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 5126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 5136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (surface != 0) { 514a6843669d4da47755ce97fb85389d4d1c52b8197Mathias Agopian binder = surface->getIGraphicBufferProducer()->asBinder(); 5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala window = surface; 5166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 51836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder,window); 51961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 52061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture( 522484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) { 523a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5249e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 525a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 5263a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 5273a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 528ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 5296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 5306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<ANativeWindow> window; 531484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden if (bufferProducer != 0) { 532484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden binder = bufferProducer->asBinder(); 533b1e7cd156ca3e1747374e0d20cdd1ce467210453Mathias Agopian window = new Surface(bufferProducer); 5346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 53536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder, window); 5366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 5376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 53836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder, 539be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala sp<ANativeWindow> window) { 540a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 5426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (binder == mPreviewSurface) { 5449e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: New window is same as old window", 5459e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId); 5466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return NO_ERROR; 5476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 549c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala Parameters::State state; 550c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala { 551c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala SharedParameters::Lock l(mParameters); 552c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala state = l.mParameters.state; 553c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala } 554c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala switch (state) { 5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 5599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 561c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala Parameters::getStateName(state)); 5629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 5659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK 5669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 5689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Already running preview - need to stop and create a new stream 56902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala res = stopStream(); 57002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (res != OK) { 57102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Unable to stop preview to swap windows: %s (%d)", 57202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 57302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala return res; 57402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 575c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 5769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 5789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 579bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala mPreviewSurface = binder; 58043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->setPreviewWindow(window); 58143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 58243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Unable to set new preview window: %s (%d)", 58343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 58443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 58543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 586bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 587c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) { 588c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala SharedParameters::Lock l(mParameters); 589c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala l.mParameters.state = state; 5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startPreviewL(l.mParameters, false); 5916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 59461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 59561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 59661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) { 597a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag); 599a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 600ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin 601228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 602228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala setPreviewCallbackFlagL(l.mParameters, flag); 605228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 606228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters ¶ms, int flag) { 608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res = OK; 609228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) { 610228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: setting oneshot", __FUNCTION__); 611228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewCallbackOneShot = true; 612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 613228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (params.previewCallbackFlags != (uint32_t)flag) { 614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewCallbackFlags = flag; 615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch(params.state) { 6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startPreviewL(params, true); 618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 621228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startRecordingL(params, true); 622228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 623228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala default: 624228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 625228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 626228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 627228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to refresh request in state %s", 6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 6292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 630228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 631228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 632228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 63361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 63461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 63561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() { 636a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 6379e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 638a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 6393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 6403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 6422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startPreviewL(l.mParameters, false); 643d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 644ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 645228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters ¶ms, bool restart) { 646d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 6476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 6480cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 6490cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart); 6500cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 651411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala if ( (params.state == Parameters::PREVIEW || 652411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala params.state == Parameters::RECORD || 653411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala params.state == Parameters::VIDEO_SNAPSHOT) 654411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala && !restart) { 655411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala // Succeed attempt to re-enter a streaming state 656411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala ALOGI("%s: Camera %d: Preview already active, ignoring restart", 657411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala __FUNCTION__, mCameraId); 65871d6454cc20b7a3bbe0cfd375c778c5fcc54795aAlex Ray return OK; 65971d6454cc20b7a3bbe0cfd375c778c5fcc54795aAlex Ray } 66071d6454cc20b7a3bbe0cfd375c778c5fcc54795aAlex Ray if (params.state > Parameters::PREVIEW && !restart) { 6614ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGE("%s: Can't start preview in state %s", 6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 6644ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return INVALID_OPERATION; 6654ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 66743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (!mStreamingProcessor->haveValidPreviewWindow()) { 6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 6696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 6706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::STOPPED; 6729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 67343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->updatePreviewStream(params); 674be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 675be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 676be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 677be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 6786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 67943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 68043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Vector<uint8_t> outputStreams; 681228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool callbacksEnabled = params.previewCallbackFlags & 682228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 683228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 6842863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala res = mCallbackProcessor->updateStream(params); 685228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 686228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 687228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 688228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 689228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 69043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getCallbackStreamId()); 691228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 692f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala if (params.zslMode && !params.recordingHint) { 6935282713a976184e41451315f1286d8075b257d58Igor Murashkin res = updateProcessorStream(mZslProcessor, params); 69469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 69569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)", 69669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 69769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 69869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 69943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getZslStreamId()); 70069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 7016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 70243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getPreviewStreamId()); 70343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 704f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala if (!params.recordingHint) { 70543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (!restart) { 70643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->updatePreviewRequest(params); 707f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala if (res != OK) { 70843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Can't set up preview request: " 70943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, 71043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala strerror(-res), res); 711f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala return res; 712f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala } 713f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala } 71443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW, 71543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams); 716f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala } else { 717f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala // With recording hint set, we're going to be operating under the 718f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala // assumption that the user will record video. To optimize recording 719f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala // startup time, create the necessary output streams for recording and 720f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala // video snapshot now if they don't already exist. 7215282713a976184e41451315f1286d8075b257d58Igor Murashkin res = updateProcessorStream(mJpegProcessor, params); 722f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala if (res != OK) { 723f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala ALOGE("%s: Camera %d: Can't pre-configure still image " 724f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala "stream: %s (%d)", 725be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 726be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 727be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 72869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 72943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (!restart) { 73043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->updateRecordingRequest(params); 73143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 73243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Can't set up preview request with " 73343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala "record hint: %s (%d)", __FUNCTION__, mCameraId, 73443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala strerror(-res), res); 73543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 73643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 73743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 73843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 73943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams); 740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 74243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)", 743be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 7456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::PREVIEW; 7486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 74961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 75061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 75161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() { 752a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 7539e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 754a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 7553a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 7563a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 75736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala stopPreviewL(); 758ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala} 759ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 76036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() { 761ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala ATRACE_CALL(); 7624c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala status_t res; 763e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds 7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::State state; 765228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala { 7662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 7672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala state = l.mParameters.state; 768228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 769228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 770228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (state) { 7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 77248af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala // Nothing to do. 773d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 775e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 777e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout); 778e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala // no break 7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 78102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala res = stopStream(); 78202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (res != OK) { 78302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)", 78402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 78502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 7864c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = mDevice->waitUntilDrained(); 7874c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res != OK) { 7884c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 7894c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 7904c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 791228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // no break 7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: { 7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala commandStopFaceDetectionL(l.mParameters); 796d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 797228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 798d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 799d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 800228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala state); 801d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 80261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 80361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 80461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() { 805a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 806a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 8073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 8083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return false; 8093a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 8102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 8112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return l.mParameters.state == Parameters::PREVIEW; 81261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 81361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 81461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 815a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 816a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 8173a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 8183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 8193a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 8222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 82478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Can't be called in state %s", 8252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 8262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 82778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 82878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala default: 82978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala // OK 83078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala break; 83178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 83278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.storeMetadataInBuffers = enabled; 83478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 83578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return OK; 83661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 83761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 83861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() { 839a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 8409e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 841a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 8429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 8433a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 8442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 845228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 8462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startRecordingL(l.mParameters, false); 847228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 8483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 849228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters ¶ms, bool restart) { 850228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res; 8510cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 8520cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart); 8530cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 854228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (params.state) { 8552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 856228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startPreviewL(params, false); 8579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) return res; 8589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 8592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 8609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Ready to go 8619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 8622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 8632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 864228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // OK to call this when recording is already on, just skip unless 865228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // we're looking to restart 866228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!restart) return OK; 8679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 8689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 8699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't start recording in state %s", 8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 8729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 8739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 8749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 875228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!params.storeMetadataInBuffers) { 87678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Recording only supported in metadata mode, but " 87778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala "non-metadata recording mode requested!", __FUNCTION__, 87878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mCameraId); 87978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 88078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 88178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 88243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (!restart) { 88343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 88443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor->updateRecordingRequest(params); 88543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 88643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 88743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 88843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 88943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 89043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 89133578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala 89282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin res = updateProcessorStream< 89382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin StreamingProcessor, 89482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin &StreamingProcessor::updateRecordingStream>(mStreamingProcessor, 89582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin params); 8969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 8979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 8989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 8999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 9009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 90143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 90243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Vector<uint8_t> outputStreams; 903228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool callbacksEnabled = params.previewCallbackFlags & 904228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 905228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 9062863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala res = mCallbackProcessor->updateStream(params); 907228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 908228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 909228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 910228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 911228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 91243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getCallbackStreamId()); 913228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 91443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getPreviewStreamId()); 91543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams.push(getRecordingStreamId()); 9169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 91743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 91843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams); 9199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 92043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)", 9219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 9229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 9239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 9249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 9252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state < Parameters::RECORD) { 9262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::RECORD; 927228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 9289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 9299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 93061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 93161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 93261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() { 933a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 9349e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 935a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 9362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 937228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 9389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 9393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 9403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 9412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 9422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 9439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to stop 9449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 9462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 9472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 9482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 9499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 9509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop recording in state %s", 9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 9522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 9539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 9549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 9559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 95633578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 95733578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala 958f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala res = startPreviewL(l.mParameters, true); 9599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 960f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to return to preview", 961f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala __FUNCTION__, mCameraId); 9629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 96361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 96461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 96561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() { 966a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 967a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 9688da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return false; 9703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 9718da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong return recordingEnabledL(); 9728da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong} 9738da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9748da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() { 9758da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong ATRACE_CALL(); 9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 9778da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 9782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return (l.mParameters.state == Parameters::RECORD 9792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || l.mParameters.state == Parameters::VIDEO_SNAPSHOT); 98061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 98161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 98261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 983a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 984a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 9853a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 98630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 98743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mStreamingProcessor->releaseRecordingFrame(mem); 98861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 98961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 99061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() { 991a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 992a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 993c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 9943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 9953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 9963a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 997174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 998f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala bool notifyImmediately = false; 999f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala bool notifySuccess = false; 1000174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 10012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 10024c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (l.mParameters.state < Parameters::PREVIEW) { 10034c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return INVALID_OPERATION; 10044c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 10054c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 10065b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin /** 10075b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin * If the camera does not support auto-focus, it is a no-op and 10085b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin * onAutoFocus(boolean, Camera) callback will be called immediately 10095b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin * with a fake value of success set to true. 10109454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala * 10119454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala * Similarly, if focus mode is set to INFINITY, there's no reason to 10129454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala * bother the HAL. 10135b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin */ 10149454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED || 10159454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) { 1016f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala notifyImmediately = true; 1017f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala notifySuccess = true; 1018f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala } 1019f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala /** 1020f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala * If we're in CAF mode, and AF has already been locked, just fire back 1021f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala * the callback right away; the HAL would not send a notification since 1022f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala * no state change would happen on a AF trigger. 1023f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala */ 1024f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE || 1025f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) && 1026f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) { 1027f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala notifyImmediately = true; 1028f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala notifySuccess = true; 1029f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala } 1030f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala /** 1031f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala * Send immediate notification back to client 1032f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala */ 1033f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala if (notifyImmediately) { 1034a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 1035a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 1036a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS, 1037f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala notifySuccess ? 1 : 0, 0); 10385b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin } 10395b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin return OK; 10405b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin } 1041f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala /** 1042f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala * Handle quirk mode for AF in scene modes 1043f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala */ 10444c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala if (l.mParameters.quirks.triggerAfWithAuto && 10454c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED && 104665dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO && 104765dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala !l.mParameters.focusingAreas[0].isEmpty()) { 10484c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala ALOGV("%s: Quirk: Switching from focusMode %d to AUTO", 10494c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala __FUNCTION__, l.mParameters.focusMode); 10504c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.shadowFocusMode = l.mParameters.focusMode; 10514c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 10524c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala updateRequests(l.mParameters); 10534c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala } 10544c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala 10552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter; 10562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala triggerId = l.mParameters.currentAfTriggerId; 1057174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 10584c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala syncWithDevice(); 1059174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1060174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerAutofocus(triggerId); 1061174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 10626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 106361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 106461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 106561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() { 1066a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1067a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 1068c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 10693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 10703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 10713a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 1072174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 1073174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 10742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 10759454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala // Canceling does nothing in FIXED or INFINITY modes 10769454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED || 10779454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) { 10789454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala return OK; 10799454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala } 10802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala triggerId = ++l.mParameters.afTriggerCounter; 10814c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala 10824c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala // When using triggerAfWithAuto quirk, may need to reset focus mode to 108365dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala // the real state at this point. No need to cancel explicitly if 108465dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala // changing the AF mode. 10854c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) { 10864c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__, 10874c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.shadowFocusMode); 10884c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.focusMode = l.mParameters.shadowFocusMode; 10894c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID; 10904c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala updateRequests(l.mParameters); 109165dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala 109265dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala return OK; 10934c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala } 1094174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 10954c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala syncWithDevice(); 1096174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1097174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerCancelAutofocus(triggerId); 1098174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 10996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 110061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 110161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 110272421521fd06787a407d06966e11f17b86900d2aBen Murdochstatus_t Camera2Client::takePicture(int msgType) { 1103a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1104a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 1105d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 11063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1107d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 11081d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala { 11091d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala SharedParameters::Lock l(mParameters); 11101d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala switch (l.mParameters.state) { 11111d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::DISCONNECTED: 11121d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::STOPPED: 11131d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 11141d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 111569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mCameraId); 11161d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala return INVALID_OPERATION; 11171d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::PREVIEW: 11181d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala // Good to go for takePicture 11191d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala res = commandStopFaceDetectionL(l.mParameters); 11201d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala if (res != OK) { 11211d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop face detection for still capture", 11221d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala __FUNCTION__, mCameraId); 11231d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala return res; 11241d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala } 11251d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala l.mParameters.state = Parameters::STILL_CAPTURE; 11261d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala break; 11271d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::RECORD: 11281d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala // Good to go for video snapshot 11291d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala l.mParameters.state = Parameters::VIDEO_SNAPSHOT; 11301d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala break; 11311d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::STILL_CAPTURE: 11321d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 11331d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala ALOGE("%s: Camera %d: Already taking a picture", 11341d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala __FUNCTION__, mCameraId); 11351d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala return INVALID_OPERATION; 11361d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala } 1137d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 11381d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId); 1139d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 11405282713a976184e41451315f1286d8075b257d58Igor Murashkin res = updateProcessorStream(mJpegProcessor, l.mParameters); 11411d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala if (res != OK) { 11421d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 11431d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 11441d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala return res; 11451d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala } 1146228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 11478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 11484c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala // Need HAL to have correct settings before (possibly) triggering precapture 11494c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala syncWithDevice(); 11504c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 1151786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin res = mCaptureSequencer->startCapture(msgType); 1152d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 115369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to start capture: %s (%d)", 1154d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1155d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1156d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 115769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 115861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 115961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 116061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) { 1161a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1162c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 1163a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 11646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala status_t res; 11653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 11663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 11672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = l.mParameters.set(params); 11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) return res; 11719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = updateRequests(l.mParameters); 11738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 11748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 117561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 1176f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 117761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const { 1178a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1179c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 1180a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 11813a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return String8(); 1182ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::ReadLock l(mParameters); 1184ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 1185c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return l.mParameters.get(); 118661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 118761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 118861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1189a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 1190a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 11913a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 11923a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1193c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1194c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1195c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala cmd, arg1, arg2); 1196c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 119736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala switch (cmd) { 119836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_SMOOTH_ZOOM: 119936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartSmoothZoomL(); 120036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_STOP_SMOOTH_ZOOM: 120136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStopSmoothZoomL(); 120236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_DISPLAY_ORIENTATION: 120336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetDisplayOrientationL(arg1); 120436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_SHUTTER_SOUND: 120536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableShutterSoundL(arg1 == 1); 120636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PLAY_RECORDING_SOUND: 120736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPlayRecordingSoundL(); 120836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_FACE_DETECTION: 120936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartFaceDetectionL(arg1); 1210228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case CAMERA_CMD_STOP_FACE_DETECTION: { 12112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 12122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return commandStopFaceDetectionL(l.mParameters); 1213228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 121436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG: 121536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableFocusMoveMsgL(arg1 == 1); 121636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PING: 121736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPingL(); 121836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT: 121936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetVideoBufferCountL(arg1); 122036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala default: 122136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unknown command %d (arguments %d, %d)", 122236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, cmd, arg1, arg2); 1223c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 122436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 122536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 122636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 122736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() { 122836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 122936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 123036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 123136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 123236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() { 123336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 123436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 123536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 123636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 123736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) { 12382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int transform = Parameters::degToTransform(degrees, 123936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 124036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (transform == -1) { 124136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as display orientation value", 124236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, mCameraId, degrees); 124336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return BAD_VALUE; 124436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 12452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (transform != l.mParameters.previewTransform && 124743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala getPreviewStreamId() != NO_STREAM) { 124843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mDevice->setStreamTransform(getPreviewStreamId(), transform); 124936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 12502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.previewTransform = transform; 125136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 125236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 125336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 125436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) { 12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 125636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (enable) { 12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.playShutterSound = true; 1258c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return OK; 125936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1260983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 126136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound may not be allowed. In that case only 126236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // allow the mediaserver process to disable the sound. 126336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala char value[PROPERTY_VALUE_MAX]; 126436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala property_get("ro.camera.sound.forced", value, "0"); 126536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (strncmp(value, "0", 2) != 0) { 126636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound is not allowed. Deny if the current 126736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // process is not mediaserver. 126836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (getCallingPid() != getpid()) { 126936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("Failed to disable shutter sound. Permission denied (pid %d)", 127036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala getCallingPid()); 127136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return PERMISSION_DENIED; 1272983cf231ab2d176a14595cdae46ff1b0c239af47James Dong } 127336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1274983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.playShutterSound = false; 127636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 127736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 1278983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 127936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() { 128036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraService->playSound(CameraService::SOUND_RECORDING); 128136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 128236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 128336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1284ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinstatus_t Camera2Client::commandStartFaceDetectionL(int /*type*/) { 12858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Starting face detection", 12868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 12878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 12912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 12922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 12932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 12948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot start face detection without preview active", 12958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 12968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return INVALID_OPERATION; 12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 13008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // Good to go for starting face detect 13018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala break; 13028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 13038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // Ignoring type 13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.fastInfo.bestFaceDetectMode == 13052d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) { 13068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Face detection not supported", 13078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 1308ea49f4b4ba9d182fd8a74c74d16590cb65f3a5f1Ziv Hendel return BAD_VALUE; 13098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFaceDetect) return OK; 13118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.enableFaceDetect = true; 13138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 13142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = updateRequests(l.mParameters); 13158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 13168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 131736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 131836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1319228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters ¶ms) { 13208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res = OK; 13218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Stopping face detection", 13228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 13238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1324228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!params.enableFaceDetect) return OK; 13258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1326228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.enableFaceDetect = false; 13278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 13282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state == Parameters::PREVIEW 13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || params.state == Parameters::RECORD 13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || params.state == Parameters::VIDEO_SNAPSHOT) { 1331228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateRequests(params); 13328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 13338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 13348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 133536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 133636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 133736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) { 13382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.enableFocusMoveMessages = enable; 1340174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 134136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 134236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 134336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 134436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() { 134536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Always ping back if access is proper and device is alive 13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 13472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.state != Parameters::DISCONNECTED) { 1348983cf231ab2d176a14595cdae46ff1b0c239af47James Dong return OK; 134936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } else { 135036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return NO_INIT; 135136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 135236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 135336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 135436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) { 13558da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong if (recordingEnabledL()) { 135636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting video buffer count after " 135736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala "recording was started", __FUNCTION__, mCameraId); 135836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return INVALID_OPERATION; 1359c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1360c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 136143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return mStreamingProcessor->setRecordingBufferCount(count); 136261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 136361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 13643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */ 1365160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) { 1366160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autofocus state now %d, last trigger %d", 1367160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1368174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendCompletedMessage = false; 1369174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendMovingMessage = false; 1370174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1371174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool success = false; 1372174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool afInMotion = false; 1373174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 13742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 1375f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala l.mParameters.focusState = newState; 13762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.focusMode) { 1377174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 1378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 1379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for the current AF 1380174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // trigger. For example, if cancel was called in between, or if we 1381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // already sent a notification about this AF call. 13822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (triggerId != l.mParameters.currentAfTriggerId) break; 1383174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1384174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1385174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1386174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1387174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1388174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 13892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = -1; 1390174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1391174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 1392174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Just starting focusing, ignore 1393174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1394174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1395174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1396174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1397174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1398174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Unexpected in AUTO/MACRO mode 1399174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d", 1400174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, newState); 1401174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1402174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1403174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1406174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1407174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1408174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1409174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1410174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1411174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for 1412174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // the current AF trigger. For example, if cancel was 1413174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // called in between, or if we already sent a 1414174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // notification about this AF call. 1415174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Send both a 'AF done' callback and a 'AF move' callback 14162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (triggerId != l.mParameters.currentAfTriggerId) break; 1417174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 1418174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 14192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages && 14202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion) { 1421174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1422174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 14232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = -1; 1424174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1425174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1426174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Cancel was called, or we switched state; care if 1427174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // currently moving 1428174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 14292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages && 14302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion) { 1431174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1432174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1433174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1434174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1435174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Start passive scan, inform upstream 1436174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = true; 1437174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1438174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1439174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Stop passive scan, inform upstream 14402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages) { 1441174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1442174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1443174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1444174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion = afInMotion; 1446174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1447174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 1448174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 1449174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 1450174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1451174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) { 1452a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala ALOGE("%s: Unexpected AF state change %d " 1453a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala "(ID %d) in focus mode %d", 1454a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala __FUNCTION__, newState, triggerId, 1455a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala l.mParameters.focusMode); 1456174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1457174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1458174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1459174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (sendMovingMessage) { 1460a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 1461a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 1462a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE, 14638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala afInMotion ? 1 : 0, 0); 14648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1465174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1466603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala if (sendCompletedMessage) { 1467a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 1468a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 1469a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS, 1470a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala success ? 1 : 0, 0); 14718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1472603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala } 1473160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1474160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1475160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) { 1476160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autoexposure state now %d, last trigger %d", 1477160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 147869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureSequencer->notifyAutoExposure(newState, triggerId); 1479160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1480160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1481a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() { 1482a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala return mParameters; 1483c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 1484c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 148569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const { 148643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return mStreamingProcessor->getPreviewStreamId(); 148769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 148869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 148969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const { 149069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return mJpegProcessor->getStreamId(); 149169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 149269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 149369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const { 149469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return mCallbackProcessor->getStreamId(); 149569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 149669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 149769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const { 149843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return mStreamingProcessor->getRecordingStreamId(); 149969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 150069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 150169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getZslStreamId() const { 150269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return mZslProcessor->getStreamId(); 150369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 150469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15054c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId, 15064c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala wp<camera2::FrameProcessor::FilteredListener> listener) { 15074c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return mFrameProcessor->registerListener(minId, maxId, listener); 15084c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala} 15094c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 15104c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId, 151169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala wp<camera2::FrameProcessor::FilteredListener> listener) { 15124c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return mFrameProcessor->removeListener(minId, maxId, listener); 151369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 151469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15154c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::stopStream() { 15164c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return mStreamingProcessor->stopStream(); 151769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 151869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15194c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart; 15204c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd; 15214c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart; 15224c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd; 15234c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart; 15244c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd; 152569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */ 15273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 1528f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters ¶ms) { 15298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 15308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15310cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state); 15320cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 15334c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = mStreamingProcessor->incrementStreamingIds(); 15344c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res != OK) { 15354c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)", 15364c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15374c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return res; 15384c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 15394c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 154043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->updatePreviewRequest(params); 15418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 15438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 154643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mStreamingProcessor->updateRecordingRequest(params); 15478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 15498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state == Parameters::PREVIEW) { 1554f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala res = startPreviewL(params, true); 15558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 15578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (params.state == Parameters::RECORD || 15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state == Parameters::VIDEO_SNAPSHOT) { 156243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = startRecordingL(params, true); 15638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 15648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 15658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 15668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 15698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 15708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 15718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 1573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height, 1574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala int format, int stride) { 1575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (format) { 1576228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 1577228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 1579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 3 / 2; 1580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 1581228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: { // YV12 1583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t ySize = stride * height; 1584f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala size_t uvStride = (stride / 2 + 0xF) & ~0xF; 1585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t uvSize = uvStride * height / 2; 1586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return ySize + uvSize * 2; 1587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 1588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 1589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 1591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 4; 1592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 1593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 1594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala default: 1595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 1596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, format); 1597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return 0; 1598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 1599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 16008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 16014c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::syncWithDevice() { 16024c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ATRACE_CALL(); 1603b66e9d6bcc45fabd1a8490d968d58cac8e1ac70cEino-Ville Talvala const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms 16044c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala status_t res; 16054c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 16064c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala int32_t activeRequestId = mStreamingProcessor->getActiveRequestId(); 16074c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (activeRequestId == 0) return OK; 16084c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 16094c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout); 16104c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res == TIMED_OUT) { 16114c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Camera %d: Timed out waiting sync with HAL", 16124c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala __FUNCTION__, mCameraId); 16134c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } else if (res != OK) { 16144c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Camera %d: Error while waiting to sync with HAL", 16154c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala __FUNCTION__, mCameraId); 16164c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 16174c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return res; 16184c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala} 16194c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 16205282713a976184e41451315f1286d8075b257d58Igor Murashkintemplate <typename ProcessorT> 16215282713a976184e41451315f1286d8075b257d58Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor, 16225282713a976184e41451315f1286d8075b257d58Igor Murashkin camera2::Parameters params) { 162382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin // No default template arguments until C++11, so we need this overload 162482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>( 162582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin processor, params); 162682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin} 162782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin 162882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkintemplate <typename ProcessorT, 162982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin status_t (ProcessorT::*updateStreamF)(const Parameters &)> 163082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor, 163182db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin Parameters params) { 16325282713a976184e41451315f1286d8075b257d58Igor Murashkin status_t res; 16335282713a976184e41451315f1286d8075b257d58Igor Murashkin 163482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin // Get raw pointer since sp<T> doesn't have operator->* 163582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin ProcessorT *processorPtr = processor.get(); 163682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin res = (processorPtr->*updateStreamF)(params); 16375282713a976184e41451315f1286d8075b257d58Igor Murashkin 16385282713a976184e41451315f1286d8075b257d58Igor Murashkin /** 16395282713a976184e41451315f1286d8075b257d58Igor Murashkin * Can't update the stream if it's busy? 16405282713a976184e41451315f1286d8075b257d58Igor Murashkin * 16415282713a976184e41451315f1286d8075b257d58Igor Murashkin * Then we need to stop the device (by temporarily clearing the request 16425282713a976184e41451315f1286d8075b257d58Igor Murashkin * queue) and then try again. Resume streaming once we're done. 16435282713a976184e41451315f1286d8075b257d58Igor Murashkin */ 16445282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res == -EBUSY) { 16455282713a976184e41451315f1286d8075b257d58Igor Murashkin res = mStreamingProcessor->togglePauseStream(/*pause*/true); 16465282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res != OK) { 16475282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)", 16485282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 16495282713a976184e41451315f1286d8075b257d58Igor Murashkin } 16505282713a976184e41451315f1286d8075b257d58Igor Murashkin 16515282713a976184e41451315f1286d8075b257d58Igor Murashkin res = mDevice->waitUntilDrained(); 16525282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res != OK) { 16535282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 16545282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 16555282713a976184e41451315f1286d8075b257d58Igor Murashkin } 16565282713a976184e41451315f1286d8075b257d58Igor Murashkin 165782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin res = (processorPtr->*updateStreamF)(params); 16585282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res != OK) { 16595282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Failed to update processing stream " 16605282713a976184e41451315f1286d8075b257d58Igor Murashkin " despite having halted streaming first: %s (%d)", 16615282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 16625282713a976184e41451315f1286d8075b257d58Igor Murashkin } 16635282713a976184e41451315f1286d8075b257d58Igor Murashkin 16645282713a976184e41451315f1286d8075b257d58Igor Murashkin res = mStreamingProcessor->togglePauseStream(/*pause*/false); 16655282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res != OK) { 16665282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)", 16675282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 16685282713a976184e41451315f1286d8075b257d58Igor Murashkin } 16695282713a976184e41451315f1286d8075b257d58Igor Murashkin } 16705282713a976184e41451315f1286d8075b257d58Igor Murashkin 16715282713a976184e41451315f1286d8075b257d58Igor Murashkin return res; 16725282713a976184e41451315f1286d8075b257d58Igor Murashkin} 1673a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin 167461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android 1675