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 17cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He#define LOG_TAG "Camera2Client" 18a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0 20a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala 21377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT#include <inttypes.h> 22f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Log.h> 23a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#include <utils/Trace.h> 2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <cutils/properties.h> 2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h> 27d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/ICameraDeviceCallbacks.h> 2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/Camera2Client.h" 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/StreamingProcessor.h" 327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/JpegProcessor.h" 337b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CaptureSequencer.h" 347b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CallbackProcessor.h" 357b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessor.h" 36ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); 3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); 3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android { 412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalausing namespace camera2; 422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() { 4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return IPCThreadState::self()->getCallingPid(); 4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService 4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService, 50d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const sp<hardware::ICameraClient>& cameraClient, 51ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16& clientPackageName, 52c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh const String8& cameraDeviceId, 53c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh int api1CameraId, 5461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int cameraFacing, 55ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin int clientPid, 56ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala uid_t clientUid, 57a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin int servicePid, 58a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin bool legacyMode): 5944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Camera2ClientBase(cameraService, cameraClient, clientPackageName, 60c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh cameraDeviceId, api1CameraId, cameraFacing, 612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala clientPid, clientUid, servicePid), 62c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh mParameters(api1CameraId, cameraFacing) 63f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 64a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 65228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.state = Parameters::DISCONNECTED; 68a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin 69a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin mLegacyMode = legacyMode; 70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 72bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peevstatus_t Camera2Client::initialize(sp<CameraProviderManager> manager, const String8& monitorTags) { 73bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peev return initializeImpl(manager, monitorTags); 74dce65c8103a8e8c3267590e90c5141d6bf842872Yin-Chia Yeh} 75dce65c8103a8e8c3267590e90c5141d6bf842872Yin-Chia Yeh 76fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chenbool Camera2Client::isZslEnabledInStillTemplate() { 77fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen bool zslEnabled = false; 78fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen CameraMetadata stillTemplate; 79fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen status_t res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE, &stillTemplate); 80fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen if (res == OK) { 81fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen camera_metadata_entry_t enableZsl = stillTemplate.find(ANDROID_CONTROL_ENABLE_ZSL); 82fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen if (enableZsl.count == 1) { 83fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen zslEnabled = (enableZsl.data.u8[0] == ANDROID_CONTROL_ENABLE_ZSL_TRUE); 84fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen } 85fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen } 86fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen 87fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen return zslEnabled; 88fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen} 89fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen 90dce65c8103a8e8c3267590e90c5141d6bf842872Yin-Chia Yehtemplate<typename TProviderPtr> 91bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peevstatus_t Camera2Client::initializeImpl(TProviderPtr providerPtr, const String8& monitorTags) 92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 93a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 94c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId); 95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 97bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peev res = Camera2ClientBase::initialize(providerPtr, monitorTags); 98ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala if (res != OK) { 99ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala return res; 100ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala } 101ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 102fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala { 103fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala SharedParameters::Lock l(mParameters); 104fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 105cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh res = l.mParameters.initialize(&(mDevice->info()), mDeviceVersion); 106fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (res != OK) { 107fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 108fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 109fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return NO_INIT; 110fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 111fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen 112fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen l.mParameters.isDeviceZslSupported = isZslEnabledInStillTemplate(); 113f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 1143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala String8 threadName; 116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 11773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mStreamingProcessor = new StreamingProcessor(this); 118254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala threadName = String8::format("C2-%d-StreamProc", 119254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala mCameraId); 12073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 121ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin mFrameProcessor = new FrameProcessor(mDevice, this); 1224bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala threadName = String8::format("C2-%d-FrameProc", 123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCameraId); 124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mFrameProcessor->run(threadName.string()); 125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureSequencer = new CaptureSequencer(this); 1274bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala threadName = String8::format("C2-%d-CaptureSeq", 128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCameraId); 129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureSequencer->run(threadName.string()); 130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mJpegProcessor = new JpegProcessor(this, mCaptureSequencer); 1324bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala threadName = String8::format("C2-%d-JpegProc", 133ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala mCameraId); 134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mJpegProcessor->run(threadName.string()); 135ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala 136d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala mZslProcessor = new ZslProcessor(this, mCaptureSequencer); 137d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 1384bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala threadName = String8::format("C2-%d-ZslProc", 139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCameraId); 140d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala mZslProcessor->run(threadName.string()); 141ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala 142d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala mCallbackProcessor = new CallbackProcessor(this); 1434bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala threadName = String8::format("C2-%d-CallbkProc", 144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCameraId); 145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCallbackProcessor->run(threadName.string()); 146d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala 147f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (gLogLevel >= 1) { 148fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala SharedParameters::Lock l(mParameters); 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(); 159d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala ALOGV("~Camera2Client"); 1604ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 161f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDestructionStarted = true; 162f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 163c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala disconnect(); 164c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-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) { 169c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala return BasicClient::dump(fd, args); 170c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala} 171c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala 172c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvalastatus_t Camera2Client::dumpClient(int fd, const Vector<String16>& args) { 173611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala String8 result; 174cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", mCameraId, 175e992e75053e98e3699af6e344c11b787e30411adEino-Ville Talvala (getRemoteCallback() != NULL ? 176f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen (IInterface::asBinder(getRemoteCallback()).get()) : NULL), 177611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala mClientPid); 1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" State: "); 1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const Parameters& p = mParameters.unsafeAccess(); 182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala result.append(Parameters::getStateName(p.state)); 1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1854ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala result.append("\n Current parameters:\n"); 1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview size: %d x %d\n", 187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewWidth, p.previewHeight); 1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview FPS range: %d - %d\n", 189836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFpsRange[0], p.previewFpsRange[1]); 1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Preview HAL pixel format: 0x%x\n", 191836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewFormat); 19211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala result.appendFormat(" Preview transform: %x\n", 193836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.previewTransform); 1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Picture size: %d x %d\n", 195836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.pictureWidth, p.pictureHeight); 1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 197836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegThumbSize[0], p.jpegThumbSize[1]); 1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.jpegQuality, p.jpegThumbQuality); 200836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation); 2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS tags %s\n", 202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsEnabled ? "enabled" : "disabled"); 203836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala if (p.gpsEnabled) { 2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 205836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[0], p.gpsCoordinates[1], 206836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsCoordinates[2]); 207377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT result.appendFormat(" GPS timestamp: %" PRId64 "\n", 208836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsTimestamp); 2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" GPS processing method: %s\n", 210836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.gpsProcessingMethod.string()); 2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" White balance mode: "); 214836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.wbMode) { 215d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO) 216d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT) 217d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT) 218d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT) 219d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT) 220d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT) 221d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT) 222d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE) 2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Effect mode: "); 227836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.effectMode) { 228d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF) 229d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO) 230d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE) 231d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE) 232d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA) 233d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE) 234d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD) 235d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD) 236d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA) 2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Antibanding mode: "); 241836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.antibandingMode) { 242d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO) 243d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF) 244d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ) 245d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ) 2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Scene mode: "); 250836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.sceneMode) { 251c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk case ANDROID_CONTROL_SCENE_MODE_DISABLED: 2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append("AUTO\n"); break; 2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Flash mode: "); 272836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.flashMode) { 2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focus mode: "); 283836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala switch (p.focusMode) { 2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 2857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 2877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 2887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 2907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 2917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 2927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala default: result.append("UNKNOWN\n"); 2937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 2947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 295d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala result.append(" Focus state: "); 296d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala switch (p.focusState) { 297d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE) 298d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN) 299d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED) 3004ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED) 301d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN) 302d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED) 303d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) 304d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala default: result.append("UNKNOWN\n"); 305d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala } 306d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala 3077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.append(" Focusing areas:\n"); 308836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.focusingAreas.size(); i++) { 3097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 310836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].left, 311836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].top, 312836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].right, 313836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].bottom, 314836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.focusingAreas[i].weight); 3157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 3167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Exposure compensation index: %d\n", 318836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.exposureCompensation); 3197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" AE lock %s, AWB lock %s\n", 321836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoExposureLock ? "enabled" : "disabled", 322836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.autoWhiteBalanceLock ? "enabled" : "disabled" ); 3237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" Metering areas:\n"); 325836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala for (size_t i = 0; i < p.meteringAreas.size(); i++) { 3267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 327836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].left, 328836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].top, 329836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].right, 330836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].bottom, 331836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.meteringAreas[i].weight); 3327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala } 3337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 334836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Zoom index: %d\n", p.zoom); 335836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala result.appendFormat(" Video size: %d x %d\n", p.videoWidth, 336836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoHeight); 3377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Recording hint is %s\n", 339836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.recordingHint ? "set" : "not set"); 3407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Video stabilization is %s\n", 342836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala p.videoStabilization ? "enabled" : "disabled"); 3437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 3440181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala result.appendFormat(" Selected still capture FPS range: %d - %d\n", 3450181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala p.fastInfo.bestStillCaptureFpsRange[0], 3460181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala p.fastInfo.bestStillCaptureFpsRange[1]); 3470181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 348c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala result.appendFormat(" Use zero shutter lag: %s\n", 349c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala p.useZeroShutterLag() ? "yes" : "no"); 350c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala 3513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Current streams:\n"); 352da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result.appendFormat(" Preview stream ID: %d\n", 353da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala getPreviewStreamId()); 354ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala result.appendFormat(" Capture stream ID: %d\n", 355da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala getCaptureStreamId()); 356da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result.appendFormat(" Recording stream ID: %d\n", 357da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala getRecordingStreamId()); 358e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 359e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala result.append(" Quirks for this camera:\n"); 360e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala bool haveQuirk = false; 361e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala if (p.quirks.triggerAfWithAuto) { 362e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala result.appendFormat(" triggerAfWithAuto\n"); 363e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala haveQuirk = true; 364e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala } 365e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala if (p.quirks.useZslFormat) { 366e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala result.appendFormat(" useZslFormat\n"); 367e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala haveQuirk = true; 368e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala } 3697373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (p.quirks.meteringCropRegion) { 3707373cbe85e617345f7002256a4be389fe62af913Igor Murashkin result.appendFormat(" meteringCropRegion\n"); 3717373cbe85e617345f7002256a4be389fe62af913Igor Murashkin haveQuirk = true; 3727373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 373fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (p.quirks.partialResults) { 374fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala result.appendFormat(" usePartialResult\n"); 375fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala haveQuirk = true; 376fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 377e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala if (!haveQuirk) { 378e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala result.appendFormat(" none\n"); 379e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala } 380e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 38173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala write(fd, result.string(), result.size()); 3823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 38373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mStreamingProcessor->dump(fd, args); 384428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala 385da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureSequencer->dump(fd, args); 386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 387c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mFrameProcessor->dump(fd, args); 388c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 38997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala mZslProcessor->dump(fd, args); 39097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 39144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return dumpDevice(fd, args); 3927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM 39361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 39461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 39561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface 39661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 397d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabinder::Status Camera2Client::disconnect() { 398a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 39944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 400c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala 401d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status res = binder::Status::ok(); 40298a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen // Allow both client and the cameraserver to disconnect at all times 403c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala int callingPid = getCallingPid(); 404d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (callingPid != mClientPid && callingPid != mServicePid) return res; 405ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 406d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (mDevice == 0) return res; 407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 40898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala ALOGV("Camera %d: Shutting down", mCameraId); 40998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 410d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala /** 411d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala * disconnect() cannot call any methods that might need to promote a 412d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala * wp<Camera2Client>, since disconnect can be called from the destructor, at 413d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala * which point all such promotions will fail. 414d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala */ 415d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala 416d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala stopPreviewL(); 4176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 41898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala { 41998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala SharedParameters::Lock l(mParameters); 420d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (l.mParameters.state == Parameters::DISCONNECTED) return res; 42198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala l.mParameters.state = Parameters::DISCONNECTED; 42298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala } 42398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 42498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mFrameProcessor->requestExit(); 42598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mCaptureSequencer->requestExit(); 42698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mJpegProcessor->requestExit(); 427d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala mZslProcessor->requestExit(); 42898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mCallbackProcessor->requestExit(); 42998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 43098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala ALOGV("Camera %d: Waiting for threads", mCameraId); 43198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 432661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala { 433661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala // Don't wait with lock held, in case the other threads need to 434661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala // complete callbacks that re-enter Camera2Client 435661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala mBinderSerializationLock.unlock(); 436661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala 437661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala mFrameProcessor->join(); 438661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala mCaptureSequencer->join(); 439661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala mJpegProcessor->join(); 440d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala mZslProcessor->join(); 441661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala mCallbackProcessor->join(); 442661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala 443661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala mBinderSerializationLock.lock(); 444661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala } 44598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 446dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk ALOGV("Camera %d: Deleting streams", mCameraId); 447dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk 448dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk mStreamingProcessor->deletePreviewStream(); 449dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk mStreamingProcessor->deleteRecordingStream(); 450dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk mJpegProcessor->deleteStream(); 451dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk mCallbackProcessor->deleteStream(); 452dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk mZslProcessor->deleteStream(); 453dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk 45498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala ALOGV("Camera %d: Disconnecting device", mCameraId); 45598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 45698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala mDevice->disconnect(); 45798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 4583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala mDevice.clear(); 4598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 46061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala CameraService::Client::disconnect(); 461d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 462d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return res; 46361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 46461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 465d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<hardware::ICameraClient>& client) { 466a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4679e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 46844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 469ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != 0 && getCallingPid() != mClientPid) { 4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Connection attempt from pid %d; " 4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "current locked to pid %d", __FUNCTION__, 4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mCameraId, getCallingPid(), mClientPid); 4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return BAD_VALUE; 4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 47944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mRemoteCallback = client; 48044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedCameraCallbacks = client; 4819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 48361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 48461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 48561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() { 486a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 4879e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 48844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 4899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 4909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 491ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 4929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == 0) { 4939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = getCallingPid(); 4949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 4959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 4969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid != getCallingPid()) { 4989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 4999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 5019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 50461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 50561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 50661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() { 507a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5089e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 50944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 5109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 5119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 512ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 5139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mClientPid == getCallingPid()) { 514907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala SharedParameters::Lock l(mParameters); 515907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala if (l.mParameters.state == Parameters::RECORD || 516907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 517907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala ALOGD("Not allowed to unlock camera during recording."); 518907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala return INVALID_OPERATION; 519907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala } 5209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mClientPid = 0; 52144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mRemoteCallback.clear(); 52244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedCameraCallbacks.clear(); 5239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 5249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 5259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 5269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 5279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 5289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return EBUSY; 52961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 53061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 5311ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvalastatus_t Camera2Client::setPreviewTarget( 5328ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer>& bufferProducer) { 533a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5349e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 53544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 5363a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 5373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 538ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 5396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<IBinder> binder; 540727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala sp<Surface> window; 5418ba01021b573889802e67e029225a96f0dfa471aAndy McFadden if (bufferProducer != 0) { 542f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen binder = IInterface::asBinder(bufferProducer); 5431ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala // Using controlledByApp flag to ensure that the buffer queue remains in 5441ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala // async mode for the old camera API, where many applications depend 5451ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala // on that behavior. 5461ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala window = new Surface(bufferProducer, /*controlledByApp*/ true); 5476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 54836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return setPreviewWindowL(binder, window); 5496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 5506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 55136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder, 5528b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh const sp<Surface>& window) { 553a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 5546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 5556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (binder == mPreviewSurface) { 5579e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: Camera %d: New window is same as old window", 5589e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala __FUNCTION__, mCameraId); 5596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return NO_ERROR; 5606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 562f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala Parameters::State state; 563f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala { 564f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala SharedParameters::Lock l(mParameters); 565f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala state = l.mParameters.state; 566f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala } 567f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala switch (state) { 5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 5712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 5729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 574f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala Parameters::getStateName(state)); 5759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 5789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK 5799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 5819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Already running preview - need to stop and create a new stream 582d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala res = stopStream(); 583d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala if (res != OK) { 584d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala ALOGE("%s: Unable to stop preview to swap windows: %s (%d)", 585d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 586d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala return res; 587d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala } 588f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 5899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 5909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 5919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 592bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala mPreviewSurface = binder; 59373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->setPreviewWindow(window); 59473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (res != OK) { 59573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Unable to set new preview window: %s (%d)", 59673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala __FUNCTION__, strerror(-res), res); 59773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return res; 59873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 599bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala 600f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) { 601f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala SharedParameters::Lock l(mParameters); 602f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala l.mParameters.state = state; 6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startPreviewL(l.mParameters, false); 6046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 60761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 60861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 60961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) { 610a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 611228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag); 61244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 613ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin 614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return; 615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 6172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala setPreviewCallbackFlagL(l.mParameters, flag); 618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 619228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 620228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters ¶ms, int flag) { 621228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t res = OK; 622a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 623a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala switch(params.state) { 624a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala case Parameters::STOPPED: 625a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 626a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala case Parameters::PREVIEW: 627a2520db02bead68d4980783c41500ae96511bdf8Zhijun He case Parameters::STILL_CAPTURE: 628a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // OK 629a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala break; 630a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala default: 631a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala if (flag & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) { 632a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala ALOGE("%s: Camera %d: Can't use preview callbacks " 633a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala "in state %d", __FUNCTION__, mCameraId, params.state); 634a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala return; 635a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala } 636a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala } 637a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 638228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) { 639228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGV("%s: setting oneshot", __FUNCTION__); 640228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewCallbackOneShot = true; 641228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 642228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (params.previewCallbackFlags != (uint32_t)flag) { 6433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 644527748abf04c0060894fd7aace54959a2c343435Zhijun He if (params.previewCallbackSurface && flag != CAMERA_FRAME_CALLBACK_FLAG_NOOP) { 6453ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // Disable any existing preview callback window when enabling 6463ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // preview callback flags 6473ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala res = mCallbackProcessor->setCallbackWindow(NULL); 6483ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala if (res != OK) { 6493ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to clear preview callback surface:" 6503ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 6513ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala return; 6523ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 6533ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala params.previewCallbackSurface = false; 6543ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 6553ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 656228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.previewCallbackFlags = flag; 6573ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 658a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala if (params.state == Parameters::PREVIEW) { 659228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startPreviewL(params, true); 660a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala if (res != OK) { 661a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to refresh request in state %s", 662a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala __FUNCTION__, mCameraId, 663a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala Parameters::getStateName(params.state)); 664a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala } 6653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 6663ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 6673ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala} 6683ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 6693ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvalastatus_t Camera2Client::setPreviewCallbackTarget( 6703ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IGraphicBufferProducer>& callbackProducer) { 6713ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala ATRACE_CALL(); 6723ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 6733ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala Mutex::Autolock icl(mBinderSerializationLock); 6743ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala status_t res; 6753ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 6763ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 677727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala sp<Surface> window; 6783ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala if (callbackProducer != 0) { 6793ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala window = new Surface(callbackProducer); 6803ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 6813ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 6823ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala res = mCallbackProcessor->setCallbackWindow(window); 6833ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala if (res != OK) { 6843ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview callback surface: %s (%d)", 6853ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 6863ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala return res; 6873ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 6883ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 6893ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala SharedParameters::Lock l(mParameters); 6903ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 6913ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala if (window != NULL) { 6923ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // Disable traditional callbacks when a valid callback target is given 6933ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala l.mParameters.previewCallbackFlags = CAMERA_FRAME_CALLBACK_FLAG_NOOP; 6943ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala l.mParameters.previewCallbackOneShot = false; 6953ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala l.mParameters.previewCallbackSurface = true; 6963ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } else { 6973ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // Disable callback target if given a NULL interface. 6983ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala l.mParameters.previewCallbackSurface = false; 6993ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 7003ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 7013ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala switch(l.mParameters.state) { 7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 7033ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala res = startPreviewL(l.mParameters, true); 704228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 7073ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala res = startRecordingL(l.mParameters, true); 708228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 709228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala default: 710228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala break; 7113ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 7123ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala if (res != OK) { 7133ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to refresh request in state %s", 7143ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala __FUNCTION__, mCameraId, 7153ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 716228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 717228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 7183ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala return OK; 71961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 72061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 7213ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 72261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() { 723a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 7249e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 72544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 7263a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 7273a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 7292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startPreviewL(l.mParameters, false); 730d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 731ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 732228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters ¶ms, bool restart) { 733d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ATRACE_CALL(); 7346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 73522d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 73622d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart); 73722d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 738a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala if ( (params.state == Parameters::PREVIEW || 739a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala params.state == Parameters::RECORD || 740a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala params.state == Parameters::VIDEO_SNAPSHOT) 741a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala && !restart) { 742a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala // Succeed attempt to re-enter a streaming state 743a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala ALOGI("%s: Camera %d: Preview already active, ignoring restart", 744a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala __FUNCTION__, mCameraId); 74577449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray return OK; 74677449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray } 74777449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray if (params.state > Parameters::PREVIEW && !restart) { 7484ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala ALOGE("%s: Can't start preview in state %s", 7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 7514ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return INVALID_OPERATION; 7524ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 7536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 75473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (!mStreamingProcessor->haveValidPreviewWindow()) { 7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 7566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 7576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::STOPPED; 759c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He int lastPreviewStreamId = mStreamingProcessor->getPreviewStreamId(); 7609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 76173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updatePreviewStream(params); 762be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 763be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 764be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 765be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala return res; 7666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 76773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 768c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He bool previewStreamChanged = mStreamingProcessor->getPreviewStreamId() != lastPreviewStreamId; 769c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He 770a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // We could wait to create the JPEG output stream until first actual use 771a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // (first takePicture call). However, this would substantially increase the 772d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // first capture latency on HAL3 devices. 773d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // So create it unconditionally at preview start. As a drawback, 774a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // this increases gralloc memory consumption for applications that don't 775355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // ever take a picture. Do not enter this mode when jpeg stream will slow 776355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // down preview. 777a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // TODO: Find a better compromise, though this likely would involve HAL 778a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // changes. 779e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He int lastJpegStreamId = mJpegProcessor->getStreamId(); 780355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // If jpeg stream will slow down preview, make sure we remove it before starting preview 781355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (params.slowJpegMode) { 782693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh // Pause preview if we are streaming 783693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh int32_t activeRequestId = mStreamingProcessor->getActiveRequestId(); 784693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh if (activeRequestId != 0) { 785693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh res = mStreamingProcessor->togglePauseStream(/*pause*/true); 786693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh if (res != OK) { 787693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)", 788693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 789693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh } 790693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh res = mDevice->waitUntilDrained(); 791693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh if (res != OK) { 792693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 793693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 794693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh } 795693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh } 796693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh 797693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh res = mJpegProcessor->deleteStream(); 798693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh 799693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh if (res != OK) { 800693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh ALOGE("%s: Camera %d: delete Jpeg stream failed: %s (%d)", 801693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 802693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh } 803693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh 804693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh if (activeRequestId != 0) { 805693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh res = mStreamingProcessor->togglePauseStream(/*pause*/false); 806693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh if (res != OK) { 807693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)", 808693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 809693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh } 810693047ddb938c16d00ef5c848aae9c52af7584efYin-Chia Yeh } 811355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } else { 812355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh res = updateProcessorStream(mJpegProcessor, params); 813355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (res != OK) { 814355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh ALOGE("%s: Camera %d: Can't pre-configure still image " 815355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh "stream: %s (%d)", 816355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 817355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return res; 818355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 819a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala } 820e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He bool jpegStreamChanged = mJpegProcessor->getStreamId() != lastJpegStreamId; 821a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala 822d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He Vector<int32_t> outputStreams; 8233ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala bool callbacksEnabled = (params.previewCallbackFlags & 8243ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) || 8253ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala params.previewCallbackSurface; 8263ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 827228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (callbacksEnabled) { 828a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // Can't have recording stream hanging around when enabling callbacks, 829a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // since it exceeds the max stream count on some devices. 830a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala if (mStreamingProcessor->getRecordingStreamId() != NO_STREAM) { 831a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala ALOGV("%s: Camera %d: Clearing out recording stream before " 832a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala "creating callback stream", __FUNCTION__, mCameraId); 833a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala res = mStreamingProcessor->stopStream(); 834a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala if (res != OK) { 835a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala ALOGE("%s: Camera %d: Can't stop streaming to delete " 836a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala "recording stream", __FUNCTION__, mCameraId); 837a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala return res; 838a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala } 839a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala res = mStreamingProcessor->deleteRecordingStream(); 840a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala if (res != OK) { 841a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete recording stream before " 842a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala "enabling callbacks: %s (%d)", __FUNCTION__, mCameraId, 843a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala strerror(-res), res); 844a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala return res; 845a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala } 846a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala } 847a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 848d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala res = mCallbackProcessor->updateStream(params); 849228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (res != OK) { 850228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 851228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 852228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return res; 853228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 85473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getCallbackStreamId()); 855c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He } else if (previewStreamChanged && mCallbackProcessor->getStreamId() != NO_STREAM) { 856c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He /** 857c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He * Delete the unused callback stream when preview stream is changed and 858c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He * preview is not enabled. Don't need stop preview stream as preview is in 859c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He * STOPPED state now. 860c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He */ 861c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He ALOGV("%s: Camera %d: Delete unused preview callback stream.", __FUNCTION__, mCameraId); 862c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He res = mCallbackProcessor->deleteStream(); 863c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He if (res != OK) { 864c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He ALOGE("%s: Camera %d: Unable to delete callback stream %s (%d)", 865c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He __FUNCTION__, mCameraId, strerror(-res), res); 866c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He return res; 867c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He } 868228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 869ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh 870c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala if (params.useZeroShutterLag() && 871ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh getRecordingStreamId() == NO_STREAM) { 872dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin res = updateProcessorStream(mZslProcessor, params); 873da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 874da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)", 875da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 876da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 877da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 878e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He 879e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He if (jpegStreamChanged) { 880e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He ALOGV("%s: Camera %d: Clear ZSL buffer queue when Jpeg size is changed", 881e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He __FUNCTION__, mCameraId); 882e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He mZslProcessor->clearZslQueue(); 883e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He } 88473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getZslStreamId()); 885661076292093f82aec488baf8460cdf204a5efd2Zhijun He } else { 886661076292093f82aec488baf8460cdf204a5efd2Zhijun He mZslProcessor->deleteStream(); 887da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 8886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 88973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getPreviewStreamId()); 89073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 891a936ac26464263367b7342a3501f3b6db2736888Chien-Yu Chen if (params.isDeviceZslSupported) { 892a936ac26464263367b7342a3501f3b6db2736888Chien-Yu Chen // If device ZSL is supported, resume preview buffers that may be paused 893a936ac26464263367b7342a3501f3b6db2736888Chien-Yu Chen // during last takePicture(). 894a936ac26464263367b7342a3501f3b6db2736888Chien-Yu Chen mDevice->dropStreamBuffers(false, getPreviewStreamId()); 895a936ac26464263367b7342a3501f3b6db2736888Chien-Yu Chen } 896a936ac26464263367b7342a3501f3b6db2736888Chien-Yu Chen 8975a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala if (!params.recordingHint) { 89873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (!restart) { 89973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updatePreviewRequest(params); 9005a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala if (res != OK) { 90173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Camera %d: Can't set up preview request: " 90273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, 90373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala strerror(-res), res); 9045a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala return res; 9055a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala } 9065a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala } 90773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW, 90873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams); 9095a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala } else { 91073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (!restart) { 91173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updateRecordingRequest(params); 91273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (res != OK) { 91373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Camera %d: Can't set up preview request with " 91473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala "record hint: %s (%d)", __FUNCTION__, mCameraId, 91573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala strerror(-res), res); 91673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return res; 91773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 91873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 91973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 92073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams); 921be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala } 922be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala if (res != OK) { 92373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)", 924be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 9256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 9266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::PREVIEW; 9296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 93061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 93161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 93261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() { 933a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 9349e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 93544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 9363a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 9373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 93836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala stopPreviewL(); 939ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala} 940ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 94136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() { 942ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala ATRACE_CALL(); 9434865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala status_t res; 944d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds 9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::State state; 946228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala { 9472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 9482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala state = l.mParameters.state; 949228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 950228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 951228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (state) { 9522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 953ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala // Nothing to do. 954d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 9552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 956d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 9572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 958d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout); 959d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala // no break 9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 962a27c4aa222c8dd1712617dad954c5f3aa68d5427Ruben Brunk syncWithDevice(); 963d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala res = stopStream(); 964d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala if (res != OK) { 965d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)", 966d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 967d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala } 9682cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma 9692cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma // Flush all in-process captures and buffer in order to stop 9702cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma // preview faster. 9712cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma res = mDevice->flush(); 9722cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma if (res != OK) { 9732cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma ALOGE("%s: Camera %d: Unable to flush pending requests: %s (%d)", 9742cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma __FUNCTION__, mCameraId, strerror(-res), res); 9752cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma } 9762cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma 9774865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala res = mDevice->waitUntilDrained(); 9784865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (res != OK) { 9794865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 9804865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 9814865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } 98228d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh // Clean up recording stream 98328d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh res = mStreamingProcessor->deleteRecordingStream(); 98428d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh if (res != OK) { 98528d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh ALOGE("%s: Camera %d: Unable to delete recording stream before " 98628d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh "stop preview: %s (%d)", 98728d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 98828d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh } 989228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // no break 9902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: { 9912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 9922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 9932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala commandStopFaceDetectionL(l.mParameters); 994d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 995228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 996d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala default: 997d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 998228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala state); 999d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 100061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 100161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 100261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() { 1003a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 100444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 10053a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 10063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return false; 10073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 10082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 10092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return l.mParameters.state == Parameters::PREVIEW; 101061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 101161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 10128cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chenstatus_t Camera2Client::setVideoBufferMode(int32_t videoBufferMode) { 1013a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 101444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 10153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 10163a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 10173a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 10182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 10192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 10202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 10212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 102278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala ALOGE("%s: Camera %d: Can't be called in state %s", 10232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 10242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 102578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 102678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala default: 102778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala // OK 102878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala break; 102978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 103078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 10318cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (videoBufferMode != VIDEO_BUFFER_MODE_BUFFER_QUEUE) { 10328cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: %d: Only video buffer queue is supported", __FUNCTION__, __LINE__); 10338cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return BAD_VALUE; 10348cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 10358cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 10368cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen l.mParameters.videoBufferMode = videoBufferMode; 103778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 103878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return OK; 103961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 104061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 104161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() { 1042a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 10439e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 104444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 10459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 10463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 10472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 1048228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 10492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return startRecordingL(l.mParameters, false); 1050228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 10513a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 1052228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters ¶ms, bool restart) { 10537fd5bdb5fa9db81f0293793b7b6d45dd833d05b2Yunlian Jiang status_t res = OK; 105422d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 105522d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart); 105622d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 1057228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (params.state) { 10582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 1059228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = startPreviewL(params, false); 10609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) return res; 106196ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He // Make sure first preview request is submitted to the HAL device to avoid 106296ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He // two consecutive set of configure_streams being called into the HAL. 106396ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He // TODO: Refactor this to avoid initial preview configuration. 106496ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He syncWithDevice(); 10659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 10662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 10679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // Ready to go 10689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 10692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 10702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 1071228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // OK to call this when recording is already on, just skip unless 1072228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // we're looking to restart 1073228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!restart) return OK; 10749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 10759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 10769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't start recording in state %s", 10772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 10782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(params.state)); 10799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return INVALID_OPERATION; 10809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 10819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 10828cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (params.videoBufferMode != VIDEO_BUFFER_MODE_BUFFER_QUEUE) { 10838cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: Camera %d: Recording only supported buffer queue mode, but " 10848cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen "mode %d is requested!", __FUNCTION__, mCameraId, params.videoBufferMode); 10858cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return INVALID_OPERATION; 10868cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 10878cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 10888cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (!mStreamingProcessor->haveValidRecordingWindow()) { 10898cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: No valid recording window", __FUNCTION__); 109078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala return INVALID_OPERATION; 109178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala } 109278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 109373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (!restart) { 10942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sCameraService->playSound(CameraService::SOUND_RECORDING_START); 109573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mStreamingProcessor->updateRecordingRequest(params); 109673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala if (res != OK) { 109773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 109873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 109973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return res; 110073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 110173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 1102609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala 1103a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // Not all devices can support a preview callback stream and a recording 1104a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // stream at the same time, so assume none of them can. 1105a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala if (mCallbackProcessor->getStreamId() != NO_STREAM) { 1106a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala ALOGV("%s: Camera %d: Clearing out callback stream before " 1107a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala "creating recording stream", __FUNCTION__, mCameraId); 1108a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala res = mStreamingProcessor->stopStream(); 1109a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala if (res != OK) { 1110a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream", 1111a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala __FUNCTION__, mCameraId); 1112a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala return res; 1113a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala } 1114a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala res = mCallbackProcessor->deleteStream(); 1115a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala if (res != OK) { 1116a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete callback stream before " 1117a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala "record: %s (%d)", __FUNCTION__, mCameraId, 1118a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala strerror(-res), res); 1119a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala return res; 1120a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala } 1121a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala } 1122ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh 1123d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Clean up ZSL before transitioning into recording 1124d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala if (mZslProcessor->getStreamId() != NO_STREAM) { 1125d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ALOGV("%s: Camera %d: Clearing out zsl stream before " 1126d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala "creating recording stream", __FUNCTION__, mCameraId); 1127d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala res = mStreamingProcessor->stopStream(); 1128d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala if (res != OK) { 1129d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream", 1130d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala __FUNCTION__, mCameraId); 1131d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala return res; 1132d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala } 1133d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala res = mDevice->waitUntilDrained(); 1134d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala if (res != OK) { 1135d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 1136d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1137d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala } 1138d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala res = mZslProcessor->clearZslQueue(); 1139d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala if (res != OK) { 1140d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ALOGE("%s: Camera %d: Can't clear zsl queue", 1141d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala __FUNCTION__, mCameraId); 1142d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala return res; 1143d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala } 1144d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala res = mZslProcessor->deleteStream(); 1145d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala if (res != OK) { 1146d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete zsl stream before " 1147d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala "record: %s (%d)", __FUNCTION__, mCameraId, 1148d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala strerror(-res), res); 1149d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala return res; 1150ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh } 1151ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh } 1152ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh 1153a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // Disable callbacks if they're enabled; can't record and use callbacks, 1154a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // and we can't fail record start without stagefright asserting. 1155a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala params.previewCallbackFlags = 0; 1156a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 1157d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // May need to reconfigure video snapshot JPEG sizes 1158d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // during recording startup, so need a more complex sequence here to 1159d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // ensure an early stream reconfiguration doesn't happen 1160d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala bool recordingStreamNeedsUpdate; 1161d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala res = mStreamingProcessor->recordingStreamNeedsUpdate(params, &recordingStreamNeedsUpdate); 1162d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala if (res != OK) { 1163d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ALOGE("%s: Camera %d: Can't query recording stream", 1164d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala __FUNCTION__, mCameraId); 1165d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala return res; 1166d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala } 1167d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 1168d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala if (recordingStreamNeedsUpdate) { 1169d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Need to stop stream here so updateProcessorStream won't trigger configureStream 1170d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Right now camera device cannot handle configureStream failure gracefully 1171d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // when device is streaming 1172d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala res = mStreamingProcessor->stopStream(); 1173a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh if (res != OK) { 1174d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop streaming to update record " 1175d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala "stream", __FUNCTION__, mCameraId); 1176a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh return res; 1177a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh } 1178d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala res = mDevice->waitUntilDrained(); 1179d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala if (res != OK) { 1180d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ALOGE("%s: Camera %d: Waiting to stop streaming failed: " 1181d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, 1182d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala strerror(-res), res); 1183a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh } 1184d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 1185a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh res = updateProcessorStream< 1186d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala StreamingProcessor, 1187d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala &StreamingProcessor::updateRecordingStream>( 1188d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala mStreamingProcessor, 1189d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala params); 1190a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh if (res != OK) { 1191d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording stream: " 1192d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala "%s (%d)", __FUNCTION__, mCameraId, 1193d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala strerror(-res), res); 1194a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh return res; 1195a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh } 1196a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh } 1197a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh 1198d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He Vector<int32_t> outputStreams; 119973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getPreviewStreamId()); 120073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams.push(getRecordingStreamId()); 12019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 120273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 120373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala outputStreams); 12043ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 1205a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh // startStream might trigger a configureStream call and device might fail 1206a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh // configureStream due to jpeg size > video size. Try again with jpeg size overridden 1207a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh // to video size. 1208a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh if (res == BAD_VALUE) { 1209a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh overrideVideoSnapshotSize(params); 12103ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 12113ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh outputStreams); 12123ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 12133ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 12149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 121573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)", 12169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 12179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return res; 12189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 12199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 12202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state < Parameters::RECORD) { 12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state = Parameters::RECORD; 1222228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 12239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 12249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return OK; 122561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 122661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 122761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() { 1228a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 12299e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 123044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 12312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 1232228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 12339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res; 12343a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return; 12353a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 12362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 12372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 12389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // OK to stop 12399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala break; 12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 12412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 12422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 12432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 12449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala default: 12459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Camera %d: Can't stop recording in state %s", 12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, mCameraId, 12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 12489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala return; 12499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 12509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 12512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sCameraService->playSound(CameraService::SOUND_RECORDING_STOP); 1252609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala 12538cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Remove recording stream because the video target may be abandoned soon. 12548cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen res = stopStream(); 12558cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (res != OK) { 12568cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)", 12578cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen __FUNCTION__, mCameraId, strerror(-res), res); 1258092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh } 1259092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh 12608cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen res = mDevice->waitUntilDrained(); 12618cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (res != OK) { 12628cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 12638cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen __FUNCTION__, mCameraId, strerror(-res), res); 12648cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 12658cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Clean up recording stream 12668cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen res = mStreamingProcessor->deleteRecordingStream(); 12678cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (res != OK) { 12688cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: Camera %d: Unable to delete recording stream before " 12698cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen "stop preview: %s (%d)", 12708cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen __FUNCTION__, mCameraId, strerror(-res), res); 12718cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 12728cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen l.mParameters.recoverOverriddenJpegSize(); 12738cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 12748cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Restart preview 12755a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala res = startPreviewL(l.mParameters, true); 12769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (res != OK) { 12775a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to return to preview", 12785a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala __FUNCTION__, mCameraId); 12799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 128061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 128161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 128261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() { 1283a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 128444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 12858da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 12863a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( checkPid(__FUNCTION__) != OK) return false; 12873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 12888da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong return recordingEnabledL(); 12898da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong} 12908da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 12918da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() { 12928da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong ATRACE_CALL(); 12932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 12948da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 12952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return (l.mParameters.state == Parameters::RECORD 12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || l.mParameters.state == Parameters::VIDEO_SNAPSHOT); 129761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 129861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 129961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 130098a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen (void)mem; 1301a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 13028cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGW("%s: Not supported in buffer queue mode.", __FUNCTION__); 130361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 130461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 13052d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chenvoid Camera2Client::releaseRecordingFrameHandle(native_handle_t *handle) { 13062d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen (void)handle; 13072d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ATRACE_CALL(); 13082d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGW("%s: Not supported in buffer queue mode.", __FUNCTION__); 13092d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen} 13102d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 1311b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yehvoid Camera2Client::releaseRecordingFrameHandleBatch( 1312b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<native_handle_t*>& handles) { 1313b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh (void)handles; 1314b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh ATRACE_CALL(); 1315b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh ALOGW("%s: Not supported in buffer queue mode.", __FUNCTION__); 1316b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh} 1317b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 131861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() { 1319a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 132044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 13218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 13223a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 13233a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 13243a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 1325174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 1326d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala bool notifyImmediately = false; 1327d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala bool notifySuccess = false; 1328174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 13304865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (l.mParameters.state < Parameters::PREVIEW) { 1331f79f8ca07f9130d67ba575748cf3481f32dcad9fZhijun He ALOGE("%s: Camera %d: Call autoFocus when preview is inactive (state = %d).", 1332f79f8ca07f9130d67ba575748cf3481f32dcad9fZhijun He __FUNCTION__, mCameraId, l.mParameters.state); 13334865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return INVALID_OPERATION; 13344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } 13354865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 13365f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin /** 13375f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin * If the camera does not support auto-focus, it is a no-op and 13385f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin * onAutoFocus(boolean, Camera) callback will be called immediately 13395f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin * with a fake value of success set to true. 13409454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala * 13419454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala * Similarly, if focus mode is set to INFINITY, there's no reason to 13429454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala * bother the HAL. 13435f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin */ 13449454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED || 13459454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) { 1346d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala notifyImmediately = true; 1347d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala notifySuccess = true; 1348d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala } 1349d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala /** 1350d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala * If we're in CAF mode, and AF has already been locked, just fire back 1351d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala * the callback right away; the HAL would not send a notification since 1352d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala * no state change would happen on a AF trigger. 1353d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala */ 1354d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE || 1355d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) && 1356d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) { 1357d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala notifyImmediately = true; 1358d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala notifySuccess = true; 1359d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala } 1360d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala /** 1361d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala * Send immediate notification back to client 1362d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala */ 1363d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala if (notifyImmediately) { 136444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 136544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (l.mRemoteCallback != 0) { 136644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS, 1367d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala notifySuccess ? 1 : 0, 0); 13685f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin } 13695f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin return OK; 13705f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin } 1371d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala /** 1372d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala * Handle quirk mode for AF in scene modes 1373d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala */ 137495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala if (l.mParameters.quirks.triggerAfWithAuto && 1375c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED && 1376ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO && 1377ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala !l.mParameters.focusingAreas[0].isEmpty()) { 137895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala ALOGV("%s: Quirk: Switching from focusMode %d to AUTO", 137995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala __FUNCTION__, l.mParameters.focusMode); 138095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.shadowFocusMode = l.mParameters.focusMode; 138195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 138295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala updateRequests(l.mParameters); 138395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala } 138495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala 13852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter; 13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala triggerId = l.mParameters.currentAfTriggerId; 1387174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 13882b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_BEGIN(kAutofocusLabel, triggerId); 13892b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 13904865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala syncWithDevice(); 1391174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1392174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerAutofocus(triggerId); 1393174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 13946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 139561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 139661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 139761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() { 1398a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 139944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 14008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 14013a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 14023a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 14033a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int triggerId; 1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 14062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 14079454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala // Canceling does nothing in FIXED or INFINITY modes 14089454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED || 14099454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) { 14109454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala return OK; 14119454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala } 14122b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 14132b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala // An active AF trigger is canceled 14142b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala if (l.mParameters.afTriggerCounter == l.mParameters.currentAfTriggerId) { 14152b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_END(kAutofocusLabel, l.mParameters.currentAfTriggerId); 14162b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala } 14172b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 14182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala triggerId = ++l.mParameters.afTriggerCounter; 141995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala 142095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // When using triggerAfWithAuto quirk, may need to reset focus mode to 1421ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala // the real state at this point. No need to cancel explicitly if 1422ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala // changing the AF mode. 142395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) { 142495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__, 142595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.shadowFocusMode); 142695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.focusMode = l.mParameters.shadowFocusMode; 142795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID; 142895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala updateRequests(l.mParameters); 1429ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala 1430ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala return OK; 143195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala } 1432c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala if (l.mParameters.allowZslMode) { 1433dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh mZslProcessor->clearZslQueue(); 1434dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh } 1435174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 14364865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala syncWithDevice(); 1437174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1438174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mDevice->triggerCancelAutofocus(triggerId); 1439174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 14406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 144161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 144261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 1443ff82370c7c04340d50673d425f48acafd00f2bc9Ben Murdochstatus_t Camera2Client::takePicture(int msgType) { 1444a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 144544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 1446d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t res; 14473a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1448d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 14492b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala int takePictureCounter; 1450b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala { 1451b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala SharedParameters::Lock l(mParameters); 1452b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala switch (l.mParameters.state) { 1453b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::DISCONNECTED: 1454b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::STOPPED: 1455b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 1456b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 1457da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, mCameraId); 1458b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala return INVALID_OPERATION; 1459b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::PREVIEW: 1460b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala // Good to go for takePicture 1461b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala res = commandStopFaceDetectionL(l.mParameters); 1462b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala if (res != OK) { 1463b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop face detection for still capture", 1464b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala __FUNCTION__, mCameraId); 1465b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala return res; 1466b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala } 1467b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala l.mParameters.state = Parameters::STILL_CAPTURE; 1468092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh 1469092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh // Remove recording stream to prevent video snapshot jpeg logic kicking in 1470092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh if (l.mParameters.isJpegSizeOverridden() && 1471092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh mStreamingProcessor->getRecordingStreamId() != NO_STREAM) { 1472092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh res = mStreamingProcessor->togglePauseStream(/*pause*/true); 1473092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh if (res != OK) { 1474092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)", 1475092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 1476092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh } 1477092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh res = mDevice->waitUntilDrained(); 1478092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh if (res != OK) { 1479092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 1480092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 1481092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh } 1482092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh // Clean up recording stream 1483092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh res = mStreamingProcessor->deleteRecordingStream(); 1484092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh if (res != OK) { 1485092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh ALOGE("%s: Camera %d: Unable to delete recording stream before " 1486092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh "stop preview: %s (%d)", 1487092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 1488092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh } 1489092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh res = mStreamingProcessor->togglePauseStream(/*pause*/false); 1490092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh if (res != OK) { 1491092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)", 1492092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 1493092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh } 1494092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh l.mParameters.recoverOverriddenJpegSize(); 1495092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh } 1496b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala break; 1497b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::RECORD: 1498b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala // Good to go for video snapshot 1499b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala l.mParameters.state = Parameters::VIDEO_SNAPSHOT; 1500b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala break; 1501b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::STILL_CAPTURE: 1502b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 1503b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala ALOGE("%s: Camera %d: Already taking a picture", 1504b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala __FUNCTION__, mCameraId); 1505b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala return INVALID_OPERATION; 1506b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala } 1507d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1508b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId); 1509e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He int lastJpegStreamId = mJpegProcessor->getStreamId(); 1510355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // slowJpegMode will create jpeg stream in CaptureSequencer before capturing 1511355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (!l.mParameters.slowJpegMode) { 1512355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh res = updateProcessorStream(mJpegProcessor, l.mParameters); 1513355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 1514355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 1515d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh // If video snapshot fail to configureStream, try override video snapshot size to 1516d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh // video size 1517d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh if (res == BAD_VALUE && l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 1518d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh overrideVideoSnapshotSize(l.mParameters); 1519d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh res = updateProcessorStream(mJpegProcessor, l.mParameters); 1520d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh } 1521b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala if (res != OK) { 1522b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 1523b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1524b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala return res; 1525b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala } 15262b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala takePictureCounter = ++l.mParameters.takePictureCounter; 1527e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He 1528e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He // Clear ZSL buffer queue when Jpeg size is changed. 1529e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He bool jpegStreamChanged = mJpegProcessor->getStreamId() != lastJpegStreamId; 1530c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala if (l.mParameters.allowZslMode && jpegStreamChanged) { 1531e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He ALOGV("%s: Camera %d: Clear ZSL buffer queue when Jpeg size is changed", 1532e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He __FUNCTION__, mCameraId); 1533e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He mZslProcessor->clearZslQueue(); 1534e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He } 1535228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 15368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15372b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_BEGIN(kTakepictureLabel, takePictureCounter); 15382b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 15394865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala // Need HAL to have correct settings before (possibly) triggering precapture 15404865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala syncWithDevice(); 15414865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 1542aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin res = mCaptureSequencer->startCapture(msgType); 1543d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1544da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to start capture: %s (%d)", 1545d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 1546d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1547d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 1548da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 154961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 155061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 155161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) { 1552a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 15538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 155444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 15556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala status_t res; 15563a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 15573a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 15596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 1560dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh Parameters::focusMode_t focusModeBefore = l.mParameters.focusMode; 15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = l.mParameters.set(params); 15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) return res; 1563dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh Parameters::focusMode_t focusModeAfter = l.mParameters.focusMode; 1564dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh 1565c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala if (l.mParameters.allowZslMode && focusModeAfter != focusModeBefore) { 1566dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh mZslProcessor->clearZslQueue(); 1567dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh } 15689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = updateRequests(l.mParameters); 15708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 15718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 157261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 1573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 157461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const { 1575a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 15768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 157744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 1578ebe865b175b3f1b2a9212cea7b008937c919d8f3Igor Murashkin // The camera service can unconditionally get the parameters at all times 1579ebe865b175b3f1b2a9212cea7b008937c919d8f3Igor Murashkin if (getCallingPid() != mServicePid && checkPid(__FUNCTION__) != OK) return String8(); 1580ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 15812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::ReadLock l(mParameters); 1582ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 15838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return l.mParameters.get(); 158461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 158561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 158661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1587a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala ATRACE_CALL(); 158844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 15893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t res; 15903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1591c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1592c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1593c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala cmd, arg1, arg2); 1594c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 159536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala switch (cmd) { 159636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_SMOOTH_ZOOM: 159736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartSmoothZoomL(); 159836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_STOP_SMOOTH_ZOOM: 159936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStopSmoothZoomL(); 160036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_DISPLAY_ORIENTATION: 160136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandSetDisplayOrientationL(arg1); 160236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_SHUTTER_SOUND: 160336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableShutterSoundL(arg1 == 1); 160436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PLAY_RECORDING_SOUND: 160536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPlayRecordingSoundL(); 160636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_START_FACE_DETECTION: 160736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandStartFaceDetectionL(arg1); 1608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case CAMERA_CMD_STOP_FACE_DETECTION: { 16092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 16102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return commandStopFaceDetectionL(l.mParameters); 1611228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 161236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG: 161336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandEnableFocusMoveMsgL(arg1 == 1); 161436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_PING: 161536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return commandPingL(); 161636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT: 1617d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala case CAMERA_CMD_SET_VIDEO_FORMAT: 16188cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: command %d (arguments %d, %d) is not supported.", 16198cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen __FUNCTION__, cmd, arg1, arg2); 16208cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return BAD_VALUE; 162136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala default: 162236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unknown command %d (arguments %d, %d)", 162336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, cmd, arg1, arg2); 1624c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 162536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 162636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 162736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 162836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() { 162936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 163036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 163136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 163236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 163336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() { 163436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Unimplemented!", __FUNCTION__); 163536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 163636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 163736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 163836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) { 16392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int transform = Parameters::degToTransform(degrees, 164036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mCameraFacing == CAMERA_FACING_FRONT); 164136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (transform == -1) { 164236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("%s: Camera %d: Error setting %d as display orientation value", 164336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala __FUNCTION__, mCameraId, degrees); 164436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return BAD_VALUE; 164536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 16462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 16472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (transform != l.mParameters.previewTransform && 164873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala getPreviewStreamId() != NO_STREAM) { 164973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mDevice->setStreamTransform(getPreviewStreamId(), transform); 165036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 16512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.previewTransform = transform; 165236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 165336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 165436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 165536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) { 16562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 165736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (enable) { 16582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.playShutterSound = true; 1659c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return OK; 166036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1661983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 1662a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin // the camera2 api legacy mode can unconditionally disable the shutter sound 1663a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin if (mLegacyMode) { 1664a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin ALOGV("%s: Disable shutter sound in legacy mode", __FUNCTION__); 1665a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin l.mParameters.playShutterSound = false; 1666a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin return OK; 1667a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin } 1668a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin 166936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound may not be allowed. In that case only 167036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // allow the mediaserver process to disable the sound. 167136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala char value[PROPERTY_VALUE_MAX]; 167236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala property_get("ro.camera.sound.forced", value, "0"); 167336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (strncmp(value, "0", 2) != 0) { 167436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Disabling shutter sound is not allowed. Deny if the current 167536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // process is not mediaserver. 167636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala if (getCallingPid() != getpid()) { 167736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala ALOGE("Failed to disable shutter sound. Permission denied (pid %d)", 167836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala getCallingPid()); 167936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return PERMISSION_DENIED; 1680983cf231ab2d176a14595cdae46ff1b0c239af47James Dong } 168136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1682983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 16832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.playShutterSound = false; 168436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 168536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 1686983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 168736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() { 16882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sCameraService->playSound(CameraService::SOUND_RECORDING_START); 168936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 169036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 169136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1692ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinstatus_t Camera2Client::commandStartFaceDetectionL(int /*type*/) { 16938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Starting face detection", 16948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 16958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 16962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 16972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.state) { 16982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::DISCONNECTED: 16992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STOPPED: 17002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::WAITING_FOR_PREVIEW_WINDOW: 17012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::STILL_CAPTURE: 17028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot start face detection without preview active", 17038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 17048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return INVALID_OPERATION; 17052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::PREVIEW: 17062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::RECORD: 17072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 17088ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // Good to go for starting face detect 17098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala break; 17108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 17118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // Ignoring type 17122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.fastInfo.bestFaceDetectMode == 1713d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) { 17148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Face detection not supported", 17158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 1716caf3a9c1447f602c658f558025b90413d1b4114dZiv Hendel return BAD_VALUE; 17178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 17182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFaceDetect) return OK; 17198ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 17202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.enableFaceDetect = true; 17218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 17222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = updateRequests(l.mParameters); 17238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 17248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 172536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 172636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1727228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters ¶ms) { 17288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res = OK; 17298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGV("%s: Camera %d: Stopping face detection", 17308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId); 17318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1732228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala if (!params.enableFaceDetect) return OK; 17338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1734228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala params.enableFaceDetect = false; 17358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 17362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state == Parameters::PREVIEW 17372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || params.state == Parameters::RECORD 17382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala || params.state == Parameters::VIDEO_SNAPSHOT) { 1739228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala res = updateRequests(params); 17408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 17418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 17428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 174336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 174436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 174536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) { 17462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 17472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.enableFocusMoveMessages = enable; 1748174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 174936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return OK; 175036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 175136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 175236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() { 175336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Always ping back if access is proper and device is alive 17542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 17552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.state != Parameters::DISCONNECTED) { 1756983cf231ab2d176a14595cdae46ff1b0c239af47James Dong return OK; 175736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } else { 175836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return NO_INIT; 175936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 176036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala} 176136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1762d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalavoid Camera2Client::notifyError(int32_t errorCode, 1763a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk const CaptureResultExtras& resultExtras) { 1764a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk int32_t err = CAMERA_ERROR_UNKNOWN; 1765a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk switch(errorCode) { 1766d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED: 1767a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk err = CAMERA_ERROR_RELEASED; 1768a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk break; 1769d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE: 1770a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk err = CAMERA_ERROR_UNKNOWN; 1771a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk break; 1772d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE: 1773a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk err = CAMERA_ERROR_SERVER_DIED; 1774a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk break; 1775d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST: 1776d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT: 1777d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER: 1778a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk ALOGW("%s: Received recoverable error %d from HAL - ignoring, requestId %" PRId32, 1779a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk __FUNCTION__, errorCode, resultExtras.requestId); 1780a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk return; 1781a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk default: 1782a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk err = CAMERA_ERROR_UNKNOWN; 1783a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk break; 1784a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk } 1785a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk 1786a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk ALOGE("%s: Error condition %d reported by HAL, requestId %" PRId32, __FUNCTION__, errorCode, 1787a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk resultExtras.requestId); 1788a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk 1789a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 1790a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk if (l.mRemoteCallback != nullptr) { 1791a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk l.mRemoteCallback->notifyCallback(CAMERA_MSG_ERROR, err, 0); 1792a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk } 1793a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk} 1794a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk 1795a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk 17963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */ 1797160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) { 1798160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autofocus state now %d, last trigger %d", 1799160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1800174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendCompletedMessage = false; 1801174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool sendMovingMessage = false; 1802174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1803174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool success = false; 1804174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool afInMotion = false; 1805174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala { 18062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters::Lock l(mParameters); 18072b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala // Trace end of AF state 18082b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala char tmp[32]; 18092b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala if (l.mParameters.afStateCounter > 0) { 18102b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala camera_metadata_enum_snprint( 18112b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp)); 18122b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_END(tmp, l.mParameters.afStateCounter); 18132b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala } 18142b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 18152b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala // Update state 1816d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala l.mParameters.focusState = newState; 18172b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala l.mParameters.afStateCounter++; 18182b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 18192b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala // Trace start of AF state 18202b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 18212b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala camera_metadata_enum_snprint( 18222b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp)); 18232b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_BEGIN(tmp, l.mParameters.afStateCounter); 18242b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 18252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (l.mParameters.focusMode) { 1826174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 1827174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 1828174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for the current AF 1829174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // trigger. For example, if cancel was called in between, or if we 1830174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // already sent a notification about this AF call. 18312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (triggerId != l.mParameters.currentAfTriggerId) break; 1832174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1833174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1834174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1835174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1836174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1837174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 18382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = -1; 1839174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1840174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 1841174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Just starting focusing, ignore 1842174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1843174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1844174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1845174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 18464ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED: 1847174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1848174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Unexpected in AUTO/MACRO mode 1849174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d", 1850174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, newState); 1851174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1852174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1853174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1854174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1855174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1856174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala switch (newState) { 1857174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1858174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala success = true; 1859174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1860174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1861174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Don't send notifications upstream if they're not for 1862174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // the current AF trigger. For example, if cancel was 1863174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // called in between, or if we already sent a 1864174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // notification about this AF call. 1865174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Send both a 'AF done' callback and a 'AF move' callback 18662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (triggerId != l.mParameters.currentAfTriggerId) break; 1867174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendCompletedMessage = true; 1868174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 18692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages && 18702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion) { 1871174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1872174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 18732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.currentAfTriggerId = -1; 1874174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1875174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_INACTIVE: 1876174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Cancel was called, or we switched state; care if 1877174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // currently moving 1878174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = false; 18792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages && 18802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion) { 1881174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1882174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1883174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1884174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1885174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Start passive scan, inform upstream 1886174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala afInMotion = true; 1887174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // no break 1888174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 18894ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED: 1890174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Stop passive scan, inform upstream 18912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (l.mParameters.enableFocusMoveMessages) { 1892174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sendMovingMessage = true; 1893174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1894174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1895174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 18962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala l.mParameters.afInMotion = afInMotion; 1897174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala break; 1898174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 1899174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 1900174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 1901174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala default: 1902174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) { 1903a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala ALOGE("%s: Unexpected AF state change %d " 1904a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala "(ID %d) in focus mode %d", 1905a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala __FUNCTION__, newState, triggerId, 1906a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala l.mParameters.focusMode); 1907174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1908174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1909174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1910174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (sendMovingMessage) { 191144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 191244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (l.mRemoteCallback != 0) { 191344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE, 19148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala afInMotion ? 1 : 0, 0); 19158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1916174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1917603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala if (sendCompletedMessage) { 19182b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_END(kAutofocusLabel, triggerId); 191944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 192044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (l.mRemoteCallback != 0) { 192144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS, 1922a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala success ? 1 : 0, 0); 19238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 1924603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala } 1925160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1926160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1927160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) { 1928160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Autoexposure state now %d, last trigger %d", 1929160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, newState, triggerId); 1930da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureSequencer->notifyAutoExposure(newState, triggerId); 1931160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 1932160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1933216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yehvoid Camera2Client::notifyShutter(const CaptureResultExtras& resultExtras, 1934216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh nsecs_t timestamp) { 1935216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh (void)resultExtras; 1936216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh (void)timestamp; 1937216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh 1938216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh ALOGV("%s: Shutter notification for request id %" PRId32 " at time %" PRId64, 1939216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh __FUNCTION__, resultExtras.requestId, timestamp); 1940216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh mCaptureSequencer->notifyShutter(resultExtras, timestamp); 1941412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala 1942412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala Camera2ClientBase::notifyShutter(resultExtras, timestamp); 1943216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh} 1944216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh 1945a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() { 1946a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala return mParameters; 1947c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala} 1948c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 1949da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const { 195073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return mStreamingProcessor->getPreviewStreamId(); 1951da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1952da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1953da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const { 1954da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mJpegProcessor->getStreamId(); 1955da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1956da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1957da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const { 1958da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mCallbackProcessor->getStreamId(); 1959da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1960da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1961da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const { 196273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return mStreamingProcessor->getRecordingStreamId(); 1963da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1964da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1965da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getZslStreamId() const { 1966da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mZslProcessor->getStreamId(); 1967da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1968da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 19694865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId, 19708b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh const wp<camera2::FrameProcessor::FilteredListener>& listener, bool sendPartials) { 197125a0aef19e170d2695f64b4c48296e7914155a88Zhijun He return mFrameProcessor->registerListener(minId, maxId, listener, sendPartials); 19724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala} 19734865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 19744865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId, 19758b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh const wp<camera2::FrameProcessor::FilteredListener>& listener) { 19764865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return mFrameProcessor->removeListener(minId, maxId, listener); 1977da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1978da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 19794865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::stopStream() { 19804865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return mStreamingProcessor->stopStream(); 1981da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1982da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1983355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yehstatus_t Camera2Client::createJpegStreamL(Parameters ¶ms) { 1984355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh status_t res = OK; 1985355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh int lastJpegStreamId = mJpegProcessor->getStreamId(); 1986355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (lastJpegStreamId != NO_STREAM) { 1987355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return INVALID_OPERATION; 1988355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 1989355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 1990355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh res = mStreamingProcessor->togglePauseStream(/*pause*/true); 1991355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (res != OK) { 1992355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)", 1993355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 1994355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return res; 1995355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 1996355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 1997355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh res = mDevice->flush(); 1998355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (res != OK) { 1999355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh ALOGE("%s: Camera %d: Unable flush device: %s (%d)", 2000355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 2001355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return res; 2002355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2003355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 2004355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // Ideally we don't need this, but current camera device 2005355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // status tracking mechanism demands it. 2006355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh res = mDevice->waitUntilDrained(); 2007355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (res != OK) { 2008355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh ALOGE("%s: Camera %d: Waiting device drain failed: %s (%d)", 2009355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 2010355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2011355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 2012355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh res = updateProcessorStream(mJpegProcessor, params); 2013355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return res; 2014355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh} 2015355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 20164865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart; 20174865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd; 20184865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart; 20194865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd; 20204865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart; 20214865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd; 2022da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 20233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */ 20243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala 20255a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters ¶ms) { 20268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala status_t res; 20278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 202822d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state); 202922d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 20304865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala res = mStreamingProcessor->incrementStreamingIds(); 20314865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (res != OK) { 20324865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)", 20334865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 20344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return res; 20354865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } 20364865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 203773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updatePreviewRequest(params); 20388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 20398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 20408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 20418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 20428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 204373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = mStreamingProcessor->updateRecordingRequest(params); 20448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 20458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 20468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 20478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 20488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 20498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 20502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (params.state == Parameters::PREVIEW) { 20515a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala res = startPreviewL(params, true); 20528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 20538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 20548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 20558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 20568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 20572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (params.state == Parameters::RECORD || 20582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.state == Parameters::VIDEO_SNAPSHOT) { 205973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala res = startRecordingL(params, true); 20608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (res != OK) { 20618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 20628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala __FUNCTION__, mCameraId, strerror(-res), res); 20638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 20648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 20658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 20668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return res; 20678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 20688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 20699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 2070228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height, 2071228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala int format, int stride) { 2072228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala switch (format) { 2073228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 2074228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 2075228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 2076228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 3 / 2; 2077228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 2078228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 2079228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: { // YV12 2080228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t ySize = stride * height; 2081f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala size_t uvStride = (stride / 2 + 0xF) & ~0xF; 2082228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala size_t uvSize = uvStride * height / 2; 2083228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return ySize + uvSize * 2; 2084228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2085228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 2086228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 2087228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 2088228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 4; 2089a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala case HAL_PIXEL_FORMAT_RAW16: 2090228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return width * height * 2; 2091228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala default: 2092228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 2093228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala __FUNCTION__, format); 2094228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return 0; 2095228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 2096228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala} 20978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 20984865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::syncWithDevice() { 20994865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala ATRACE_CALL(); 210043b7ac6bd1a949ecb8ffc7e50d0a2f01a6258034Eino-Ville Talvala const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms 21014865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala status_t res; 21024865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 21034865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala int32_t activeRequestId = mStreamingProcessor->getActiveRequestId(); 21044865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (activeRequestId == 0) return OK; 21054865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 21064865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout); 21074865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (res == TIMED_OUT) { 21084865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala ALOGE("%s: Camera %d: Timed out waiting sync with HAL", 21094865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala __FUNCTION__, mCameraId); 21104865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } else if (res != OK) { 21114865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala ALOGE("%s: Camera %d: Error while waiting to sync with HAL", 21124865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala __FUNCTION__, mCameraId); 21134865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } 21144865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala return res; 21154865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala} 21164865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 2117dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkintemplate <typename ProcessorT> 2118dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor, 2119dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin camera2::Parameters params) { 212082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin // No default template arguments until C++11, so we need this overload 212182db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>( 212282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin processor, params); 212382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin} 212482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin 212582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkintemplate <typename ProcessorT, 212682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin status_t (ProcessorT::*updateStreamF)(const Parameters &)> 212782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor, 212882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin Parameters params) { 2129dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin status_t res; 2130dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin 213182db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin // Get raw pointer since sp<T> doesn't have operator->* 213282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin ProcessorT *processorPtr = processor.get(); 213382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin res = (processorPtr->*updateStreamF)(params); 2134dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin 2135dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin /** 2136dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin * Can't update the stream if it's busy? 2137dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin * 2138dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin * Then we need to stop the device (by temporarily clearing the request 2139dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin * queue) and then try again. Resume streaming once we're done. 2140dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin */ 2141dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin if (res == -EBUSY) { 2142a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala ALOGV("%s: Camera %d: Pausing to update stream", __FUNCTION__, 2143a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala mCameraId); 2144dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin res = mStreamingProcessor->togglePauseStream(/*pause*/true); 2145dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin if (res != OK) { 2146dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)", 2147dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 2148dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin } 2149dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin 2150dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin res = mDevice->waitUntilDrained(); 2151dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin if (res != OK) { 2152dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 2153dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 2154dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin } 2155dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin 215682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin res = (processorPtr->*updateStreamF)(params); 2157dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin if (res != OK) { 2158dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin ALOGE("%s: Camera %d: Failed to update processing stream " 2159dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin " despite having halted streaming first: %s (%d)", 2160dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 2161dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin } 2162dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin 2163dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin res = mStreamingProcessor->togglePauseStream(/*pause*/false); 2164dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin if (res != OK) { 2165dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)", 2166dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin __FUNCTION__, mCameraId, strerror(-res), res); 2167dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin } 2168dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin } 2169dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin 2170dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin return res; 2171dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin} 217244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 2173a53021f776d0c82271727e5817388936513feb92Yin-Chia Yehstatus_t Camera2Client::overrideVideoSnapshotSize(Parameters ¶ms) { 2174a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh ALOGV("%s: Camera %d: configure still size to video size before recording" 2175a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh , __FUNCTION__, mCameraId); 2176a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh params.overrideJpegSizeByVideoSize(); 2177a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh status_t res = updateProcessorStream(mJpegProcessor, params); 2178a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh if (res != OK) { 2179a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh ALOGE("%s: Camera %d: Can't override video snapshot size to video size: %s (%d)", 2180a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh __FUNCTION__, mCameraId, strerror(-res), res); 2181a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh } 2182a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh return res; 2183a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh} 2184a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh 21858cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chenstatus_t Camera2Client::setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer) { 21868cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ATRACE_CALL(); 21878cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGV("%s: E", __FUNCTION__); 21888cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen Mutex::Autolock icl(mBinderSerializationLock); 21898cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen status_t res; 21908cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 21918cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 21928cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen sp<IBinder> binder = IInterface::asBinder(bufferProducer); 21938cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (binder == mVideoSurface) { 21948cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGV("%s: Camera %d: New video window is same as old video window", 21958cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen __FUNCTION__, mCameraId); 21968cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return NO_ERROR; 21978cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 21988cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 21998cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen sp<Surface> window; 22008cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen int format; 22018cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen android_dataspace dataSpace; 22028cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 22038cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (bufferProducer != nullptr) { 22048cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Using controlledByApp flag to ensure that the buffer queue remains in 22058cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // async mode for the old camera API, where many applications depend 22068cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // on that behavior. 22078cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen window = new Surface(bufferProducer, /*controlledByApp*/ true); 22088cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 22098cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ANativeWindow *anw = window.get(); 22108cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 22118cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if ((res = anw->query(anw, NATIVE_WINDOW_FORMAT, &format)) != OK) { 22128cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: Failed to query Surface format", __FUNCTION__); 22138cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return res; 22148cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 22158cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 22168cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if ((res = anw->query(anw, NATIVE_WINDOW_DEFAULT_DATASPACE, 22178cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen reinterpret_cast<int*>(&dataSpace))) != OK) { 22188cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: Failed to query Surface dataSpace", __FUNCTION__); 22198cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return res; 22208cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 22218cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 22228cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 22238cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen Parameters::State state; 22248cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen { 22258cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen SharedParameters::Lock l(mParameters); 22268cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen state = l.mParameters.state; 22278cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 22288cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 22298cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen switch (state) { 22308cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen case Parameters::STOPPED: 22318cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen case Parameters::WAITING_FOR_PREVIEW_WINDOW: 22328cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen case Parameters::PREVIEW: 22338cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // OK 22348cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen break; 22358cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen case Parameters::DISCONNECTED: 22368cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen case Parameters::RECORD: 22378cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen case Parameters::STILL_CAPTURE: 22388cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen case Parameters::VIDEO_SNAPSHOT: 22398cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen default: 22408cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: Camera %d: Cannot set video target while in state %s", 22418cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen __FUNCTION__, mCameraId, 22428cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen Parameters::getStateName(state)); 22438cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return INVALID_OPERATION; 22448cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 22458cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 22468cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen mVideoSurface = binder; 22478cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen res = mStreamingProcessor->setRecordingWindow(window); 22488cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (res != OK) { 22498cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGE("%s: Unable to set new recording window: %s (%d)", 22508cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen __FUNCTION__, strerror(-res), res); 22518cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return res; 22528cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 22538cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 22548cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen { 22558cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen SharedParameters::Lock l(mParameters); 22568cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen l.mParameters.videoFormat = format; 22578cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen l.mParameters.videoDataSpace = dataSpace; 22588cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen } 22598cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 22608cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return OK; 22618cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen} 22628cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 22632b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvalaconst char* Camera2Client::kAutofocusLabel = "autofocus"; 22642b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvalaconst char* Camera2Client::kTakepictureLabel = "take_picture"; 22652b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 226661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android 2267