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 &params, 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 &params, 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 &params, 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 &params) {
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 &params) {
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 &params) {
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 &params) {
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