Camera2Client.cpp revision e074a93046ebe5cea0b55c3a479e082a426e1e07
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>
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/Camera2Client.h"
297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/StreamingProcessor.h"
317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/JpegProcessor.h"
327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CaptureSequencer.h"
337b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CallbackProcessor.h"
347b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessor.h"
357b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessor3.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,
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
51ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        const String16& clientPackageName,
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
54ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin        int clientPid,
55ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        uid_t clientUid,
56a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin        int servicePid,
57a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin        bool legacyMode):
5844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        Camera2ClientBase(cameraService, cameraClient, clientPackageName,
59ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                cameraId, cameraFacing, clientPid, clientUid, servicePid),
60cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        mParameters(cameraId, cameraFacing)
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
62a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
63228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
66a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin
67a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin    mLegacyMode = legacyMode;
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
70e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yehstatus_t Camera2Client::initialize(CameraModule *module)
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
72a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
73c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
76e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin    res = Camera2ClientBase::initialize(module);
77ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    if (res != OK) {
78ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        return res;
79ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    }
80ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
81fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    {
82fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
83fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
84cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        res = l.mParameters.initialize(&(mDevice->info()), mDeviceVersion);
85fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (res != OK) {
86fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
87fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
88fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            return NO_INIT;
89fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        }
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    String8 threadName;
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
9473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor = new StreamingProcessor(this);
95254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    threadName = String8::format("C2-%d-StreamProc",
96254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala            mCameraId);
97254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->run(threadName.string());
9873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
99ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    mFrameProcessor = new FrameProcessor(mDevice, this);
1004bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-FrameProc",
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mFrameProcessor->run(threadName.string());
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer = new CaptureSequencer(this);
1054bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CaptureSeq",
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->run(threadName.string());
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
1104bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-JpegProc",
111ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala            mCameraId);
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->run(threadName.string());
113ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
114ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    switch (mDeviceVersion) {
115ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        case CAMERA_DEVICE_API_VERSION_2_0: {
116ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            sp<ZslProcessor> zslProc =
117ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin                    new ZslProcessor(this, mCaptureSequencer);
118ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessor = zslProc;
119ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessorThread = zslProc;
120ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            break;
121ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        }
12295dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He        case CAMERA_DEVICE_API_VERSION_3_0:
12395dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He        case CAMERA_DEVICE_API_VERSION_3_1:
12495dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He        case CAMERA_DEVICE_API_VERSION_3_2: {
125ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            sp<ZslProcessor3> zslProc =
126ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin                    new ZslProcessor3(this, mCaptureSequencer);
127ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessor = zslProc;
128ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessorThread = zslProc;
129ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            break;
130ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        }
131ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        default:
132ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            break;
133ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    }
1344bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-ZslProc",
135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
136ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    mZslProcessorThread->run(threadName.string());
137ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
138d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor = new CallbackProcessor(this);
1394bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CallbkProc",
140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCallbackProcessor->run(threadName.string());
142d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala
143f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
144fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
1472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGD("%s", l.mParameters.paramsFlattened.string());
148f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
149f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
150f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
15161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
15261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
15361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
154a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
155d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala    ALOGV("~Camera2Client");
1564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
157f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
158f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
159c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    disconnect();
160c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
161da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Closed", mCameraId);
16261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
16361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
16461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
165611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
166d0158c38ad82c1c3033a6dd5806435def3727784Eino-Ville Talvala    result.appendFormat("Client2[%d] (%p) Client: %s PID: %d, dump:\n",
167611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
168e992e75053e98e3699af6e344c11b787e30411adEino-Ville Talvala            (getRemoteCallback() != NULL ?
169f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen                    (IInterface::asBinder(getRemoteCallback()).get()) : NULL),
170d0158c38ad82c1c3033a6dd5806435def3727784Eino-Ville Talvala            String8(mClientPackageName).string(),
171611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
176836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1794ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
181836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
183836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
185836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
18611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
189836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
191836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
193836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
194836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
196836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
197836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
200836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
201377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT        result.appendFormat("    GPS timestamp: %" PRId64 "\n",
202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
204836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
208836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
209d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO)
210d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT)
211d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT)
212d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT)
213d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT)
214d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)
215d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT)
216d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE)
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
221836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
222d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF)
223d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO)
224d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE)
225d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE)
226d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA)
227d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE)
228d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD)
229d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD)
230d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA)
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
235836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
236d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO)
237d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF)
238d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ)
239d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ)
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
244836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
245c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk        case ANDROID_CONTROL_SCENE_MODE_DISABLED:
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
266836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
277836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
289d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    result.append("   Focus state: ");
290d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    switch (p.focusState) {
291d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE)
292d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
293d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
2944ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED)
295d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN)
296d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED)
297d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
298d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        default: result.append("UNKNOWN\n");
299d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    }
300d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala
3017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
302836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
3037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
305836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
306836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
308836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
3097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
312836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
3137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
315836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
316836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
3177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
319836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
3207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
321836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
322836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
323836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
324836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
325836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
3267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
328836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
329836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
330836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
3317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
333836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
3347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
336836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
3377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3380181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    result.appendFormat("    Selected still capture FPS range: %d - %d\n",
3390181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            p.fastInfo.bestStillCaptureFpsRange[0],
3400181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            p.fastInfo.bestStillCaptureFpsRange[1]);
3410181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
3423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n",
344da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId());
345ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n",
346da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getCaptureStreamId());
347da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n",
348da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId());
349e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
350e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    result.append("  Quirks for this camera:\n");
351e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    bool haveQuirk = false;
352e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.triggerAfWithAuto) {
353e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    triggerAfWithAuto\n");
354e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
355e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
356e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.useZslFormat) {
357e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    useZslFormat\n");
358e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
359e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
3607373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (p.quirks.meteringCropRegion) {
3617373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        result.appendFormat("    meteringCropRegion\n");
3627373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        haveQuirk = true;
3637373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
364fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (p.quirks.partialResults) {
365fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        result.appendFormat("    usePartialResult\n");
366fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        haveQuirk = true;
367fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
368e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (!haveQuirk) {
369e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    none\n");
370e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
371e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
37273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    write(fd, result.string(), result.size());
3733297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
37473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->dump(fd, args);
375428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
376da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->dump(fd, args);
377da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
378c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
379c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
38097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala    mZslProcessor->dump(fd, args);
38197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala
38244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    return dumpDevice(fd, args);
3837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
38461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
38561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
38761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
389a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
39044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
391c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala
392c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    // Allow both client and the media server to disconnect at all times
393c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    int callingPid = getCallingPid();
394c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    if (callingPid != mClientPid && callingPid != mServicePid) return;
395ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
396f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
397f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
39898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Shutting down", mCameraId);
39998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
400d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala    /**
401d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * disconnect() cannot call any methods that might need to promote a
402d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * wp<Camera2Client>, since disconnect can be called from the destructor, at
403d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * which point all such promotions will fail.
404d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     */
405d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala
406d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    stopPreviewL();
4076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
40898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    {
40998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
410c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala        if (l.mParameters.state == Parameters::DISCONNECTED) return;
41198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        l.mParameters.state = Parameters::DISCONNECTED;
41298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    }
41398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
414254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->requestExit();
41598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mFrameProcessor->requestExit();
41698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCaptureSequencer->requestExit();
41798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mJpegProcessor->requestExit();
418ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    mZslProcessorThread->requestExit();
41998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCallbackProcessor->requestExit();
42098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
42198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Waiting for threads", mCameraId);
42298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
423661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala    {
424661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        // Don't wait with lock held, in case the other threads need to
425661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        // complete callbacks that re-enter Camera2Client
426661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mBinderSerializationLock.unlock();
427661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala
428661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mStreamingProcessor->join();
429661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mFrameProcessor->join();
430661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mCaptureSequencer->join();
431661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mJpegProcessor->join();
432661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mZslProcessorThread->join();
433661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mCallbackProcessor->join();
434661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala
435661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mBinderSerializationLock.lock();
436661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala    }
43798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
438dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    ALOGV("Camera %d: Deleting streams", mCameraId);
439dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk
440dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mStreamingProcessor->deletePreviewStream();
441dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mStreamingProcessor->deleteRecordingStream();
442dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mJpegProcessor->deleteStream();
443dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mCallbackProcessor->deleteStream();
444dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mZslProcessor->deleteStream();
445dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk
4466551e1ede59f4a3043fb141159ca67bd2c85a911Ruben Brunk    // Remove all ZSL stream state before disconnect; needed to work around b/15408128.
4476551e1ede59f4a3043fb141159ca67bd2c85a911Ruben Brunk    mZslProcessor->disconnect();
4486551e1ede59f4a3043fb141159ca67bd2c85a911Ruben Brunk
44998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Disconnecting device", mCameraId);
45098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
45198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mDevice->disconnect();
45298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
4533a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
4548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
45561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
45661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
45761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
45861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
459a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4609e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
46144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
462ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
4689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
4718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
47244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    mRemoteCallback = client;
47344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    mSharedCameraCallbacks = client;
4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
47661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
47761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
47861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
479a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4809e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
48144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
4829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
484ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
49761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
49861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
49961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
500a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5019e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
50244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
5049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
505ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
5069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
507907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        SharedParameters::Lock l(mParameters);
508907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        if (l.mParameters.state == Parameters::RECORD ||
509907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
510907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala            ALOGD("Not allowed to unlock camera during recording.");
511907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala            return INVALID_OPERATION;
512907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        }
5139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
51444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        mRemoteCallback.clear();
51544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        mSharedCameraCallbacks.clear();
5169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
5179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
5199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
5209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
5219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
52261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
52361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5241ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvalastatus_t Camera2Client::setPreviewTarget(
5258ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
526a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5279e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
52844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
5293a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5303a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
531ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
5326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
5336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
5348ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    if (bufferProducer != 0) {
535f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen        binder = IInterface::asBinder(bufferProducer);
5361ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // Using controlledByApp flag to ensure that the buffer queue remains in
5371ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // async mode for the old camera API, where many applications depend
5381ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // on that behavior.
5391ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        window = new Surface(bufferProducer, /*controlledByApp*/ true);
5406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
54136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
5426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
5436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
54436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
545be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
546a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
5509e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
5519e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
5526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
555f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    Parameters::State state;
556f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    {
557f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        SharedParameters::Lock l(mParameters);
558f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        state = l.mParameters.state;
559f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    }
560f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    switch (state) {
5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
567f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                    Parameters::getStateName(state));
5689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
575d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            res = stopStream();
576d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            if (res != OK) {
577d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                ALOGE("%s: Unable to stop preview to swap windows: %s (%d)",
578d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                        __FUNCTION__, strerror(-res), res);
579d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                return res;
580d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            }
581f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala            state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
585bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
58673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->setPreviewWindow(window);
58773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (res != OK) {
58873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Unable to set new preview window: %s (%d)",
58973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
59073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        return res;
59173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
592bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
593f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
594f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        SharedParameters::Lock l(mParameters);
595f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        l.mParameters.state = state;
5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
60061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
60161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
603a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
604228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
60544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
606ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin
607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
611228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
613228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
615a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
616a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    switch(params.state) {
617a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::STOPPED:
618a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
619a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::PREVIEW:
620a2520db02bead68d4980783c41500ae96511bdf8Zhijun He        case Parameters::STILL_CAPTURE:
621a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            // OK
622a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            break;
623a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        default:
624a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (flag & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
625a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't use preview callbacks "
626a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "in state %d", __FUNCTION__, mCameraId, params.state);
627a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return;
628a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
629a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    }
630a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
631228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
632228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
635228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
6363ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
637527748abf04c0060894fd7aace54959a2c343435Zhijun He        if (params.previewCallbackSurface && flag != CAMERA_FRAME_CALLBACK_FLAG_NOOP) {
6383ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // Disable any existing preview callback window when enabling
6393ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // preview callback flags
6403ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = mCallbackProcessor->setCallbackWindow(NULL);
6413ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            if (res != OK) {
6423ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to clear preview callback surface:"
6433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                        " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
6443ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                return;
6453ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            }
6463ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            params.previewCallbackSurface = false;
6473ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        }
6483ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
649228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
6503ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
651a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (params.state == Parameters::PREVIEW) {
652228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
653a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
654a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to refresh request in state %s",
655a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        __FUNCTION__, mCameraId,
656a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        Parameters::getStateName(params.state));
657a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
6583ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        }
6593ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6603ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala}
6613ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvalastatus_t Camera2Client::setPreviewCallbackTarget(
6633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        const sp<IGraphicBufferProducer>& callbackProducer) {
6643ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    ATRACE_CALL();
6653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
6663ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    Mutex::Autolock icl(mBinderSerializationLock);
6673ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    status_t res;
6683ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6693ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6703ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    sp<ANativeWindow> window;
6713ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (callbackProducer != 0) {
6723ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        window = new Surface(callbackProducer);
6733ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6743ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6753ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    res = mCallbackProcessor->setCallbackWindow(window);
6763ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (res != OK) {
6773ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview callback surface: %s (%d)",
6783ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6793ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        return res;
6803ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6813ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6823ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6833ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6843ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (window != NULL) {
6853ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        // Disable traditional callbacks when a valid callback target is given
6863ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackFlags = CAMERA_FRAME_CALLBACK_FLAG_NOOP;
6873ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackOneShot = false;
6883ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackSurface = true;
6893ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    } else {
6903ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        // Disable callback target if given a NULL interface.
6913ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackSurface = false;
6923ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6933ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6943ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    switch(l.mParameters.state) {
6952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
6963ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = startPreviewL(l.mParameters, true);
697228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
7003ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = startRecordingL(l.mParameters, true);
701228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
702228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
703228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
7043ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
7053ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (res != OK) {
7063ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to refresh request in state %s",
7073ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                __FUNCTION__, mCameraId,
7083ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                Parameters::getStateName(l.mParameters.state));
709228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
710228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
7113ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    return OK;
71261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
71361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
7143ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
71561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
716a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7179e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
71844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
7193a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7203a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
723d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
724ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
725228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
726d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
7276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
72822d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
72922d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
73022d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
731a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala    if ( (params.state == Parameters::PREVIEW ||
732a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                    params.state == Parameters::RECORD ||
733a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                    params.state == Parameters::VIDEO_SNAPSHOT)
734a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala            && !restart) {
735a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        // Succeed attempt to re-enter a streaming state
736a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        ALOGI("%s: Camera %d: Preview already active, ignoring restart",
737a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                __FUNCTION__, mCameraId);
73877449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray        return OK;
73977449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    }
74077449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    if (params.state > Parameters::PREVIEW && !restart) {
7414ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
7432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
7444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
7454ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
7466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
74773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!mStreamingProcessor->haveValidPreviewWindow()) {
7482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
7496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
7506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
752c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    int lastPreviewStreamId = mStreamingProcessor->getPreviewStreamId();
7539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
75473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewStream(params);
755be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
756be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
757be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
758be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
7596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
76073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
761c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    bool previewStreamChanged = mStreamingProcessor->getPreviewStreamId() != lastPreviewStreamId;
762c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He
763a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // We could wait to create the JPEG output stream until first actual use
764a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // (first takePicture call). However, this would substantially increase the
765a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // first capture latency on HAL3 devices, and potentially on some HAL2
766a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // devices. So create it unconditionally at preview start. As a drawback,
767a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // this increases gralloc memory consumption for applications that don't
768a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // ever take a picture.
769a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // TODO: Find a better compromise, though this likely would involve HAL
770a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // changes.
771e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He    int lastJpegStreamId = mJpegProcessor->getStreamId();
772a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    res = updateProcessorStream(mJpegProcessor, params);
773a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    if (res != OK) {
774a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala        ALOGE("%s: Camera %d: Can't pre-configure still image "
775a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                "stream: %s (%d)",
776a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
777a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala        return res;
778a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    }
779e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He    bool jpegStreamChanged = mJpegProcessor->getStreamId() != lastJpegStreamId;
780a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala
781d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    Vector<int32_t> outputStreams;
7823ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    bool callbacksEnabled = (params.previewCallbackFlags &
7833ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ||
7843ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            params.previewCallbackSurface;
7853ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
786228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
787a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        // Can't have recording stream hanging around when enabling callbacks,
788a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        // since it exceeds the max stream count on some devices.
789a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (mStreamingProcessor->getRecordingStreamId() != NO_STREAM) {
790a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGV("%s: Camera %d: Clearing out recording stream before "
791a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    "creating callback stream", __FUNCTION__, mCameraId);
792a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            res = mStreamingProcessor->stopStream();
793a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
794a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming to delete "
795a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "recording stream", __FUNCTION__, mCameraId);
796a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return res;
797a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
798a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            res = mStreamingProcessor->deleteRecordingStream();
799a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
800a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete recording stream before "
801a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "enabling callbacks: %s (%d)", __FUNCTION__, mCameraId,
802a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        strerror(-res), res);
803a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return res;
804a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
805a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
806a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
807d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
809228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
810228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
811228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
812228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
81373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getCallbackStreamId());
814c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    } else if (previewStreamChanged && mCallbackProcessor->getStreamId() != NO_STREAM) {
815c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        /**
816c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * Delete the unused callback stream when preview stream is changed and
817c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * preview is not enabled. Don't need stop preview stream as preview is in
818c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * STOPPED state now.
819c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         */
820c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        ALOGV("%s: Camera %d: Delete unused preview callback stream.",  __FUNCTION__, mCameraId);
821c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        res = mCallbackProcessor->deleteStream();
822c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        if (res != OK) {
823c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            ALOGE("%s: Camera %d: Unable to delete callback stream %s (%d)",
824c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He                    __FUNCTION__, mCameraId, strerror(-res), res);
825c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            return res;
826c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        }
827228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
828ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh
829ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh    if (params.zslMode && !params.recordingHint &&
830ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            getRecordingStreamId() == NO_STREAM) {
831dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = updateProcessorStream(mZslProcessor, params);
832da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
833da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
834da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
835da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
836da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
837e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He
838e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        if (jpegStreamChanged) {
839e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            ALOGV("%s: Camera %d: Clear ZSL buffer queue when Jpeg size is changed",
840e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                    __FUNCTION__, mCameraId);
841e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            mZslProcessor->clearZslQueue();
842e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        }
84373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getZslStreamId());
844661076292093f82aec488baf8460cdf204a5efd2Zhijun He    } else {
845661076292093f82aec488baf8460cdf204a5efd2Zhijun He        mZslProcessor->deleteStream();
846da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
8476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
84873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
84973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
8505a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    if (!params.recordingHint) {
85173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
85273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updatePreviewRequest(params);
8535a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            if (res != OK) {
85473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request: "
85573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId,
85673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
8575a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                return res;
8585a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            }
8595a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        }
86073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
86173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
8625a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    } else {
86373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
86473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updateRecordingRequest(params);
86573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            if (res != OK) {
86673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request with "
86773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "record hint: %s (%d)", __FUNCTION__, mCameraId,
86873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
86973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                return res;
87073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            }
87173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
87273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
87373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
874be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
875be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
87673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
877be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
8796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
8826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
88361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
88461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
88561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
886a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8879e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
88844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
8893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
89136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
892ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
893ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
89436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
895ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
8964865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
897d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds
8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
899228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
9002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
9012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
902228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
903228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
904228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
9052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
906ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            // Nothing to do.
907d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
909d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
9102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
911d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout);
912d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            // no break
9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
915a27c4aa222c8dd1712617dad954c5f3aa68d5427Ruben Brunk            syncWithDevice();
916d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            res = stopStream();
917d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            if (res != OK) {
918d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)",
919d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
920d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            }
9212cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma
9222cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            // Flush all in-process captures and buffer in order to stop
9232cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            // preview faster.
9242cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            res = mDevice->flush();
9252cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            if (res != OK) {
9262cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma                ALOGE("%s: Camera %d: Unable to flush pending requests: %s (%d)",
9272cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma                        __FUNCTION__, mCameraId, strerror(-res), res);
9282cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            }
9292cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma
9304865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            res = mDevice->waitUntilDrained();
9314865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            if (res != OK) {
9324865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
9334865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
9344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            }
93528d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            // Clean up recording stream
93628d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            res = mStreamingProcessor->deleteRecordingStream();
93728d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            if (res != OK) {
93828d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh                ALOGE("%s: Camera %d: Unable to delete recording stream before "
93928d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh                        "stop preview: %s (%d)",
94028d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh                        __FUNCTION__, mCameraId, strerror(-res), res);
94128d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            }
942228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
9432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
9442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
9462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
947d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
948228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
949d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
950d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
951228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
952d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
95361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
95461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
95561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
956a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
95744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
9603a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
96361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
96461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
96561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
966a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
96744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
9732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
97578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
97878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
97978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
98078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
98178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
98278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
98378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
9842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
98578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
98678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
98761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
98861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
98961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
990a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9919e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
99244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
9943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
996228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
998228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
9993a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1000228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
1001228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
100222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
100322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
100422d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
1005228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
10062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
1007228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
10089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
100996ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He            // Make sure first preview request is submitted to the HAL device to avoid
101096ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He            // two consecutive set of configure_streams being called into the HAL.
101196ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He            // TODO: Refactor this to avoid initial preview configuration.
101296ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He            syncWithDevice();
10139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
10142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
10159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
10169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
10172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
10182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
1019228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
1020228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
1021228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
10229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
10239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
10249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
10252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
10262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
10279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
10289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
10299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1030228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
103178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
103278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
103378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
103478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
103578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
103678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
103773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!restart) {
103873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mCameraService->playSound(CameraService::SOUND_RECORDING);
103973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mStreamingProcessor->updateRecordingRequest(params);
104073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (res != OK) {
104173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
104273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
104373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            return res;
104473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
104573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
1046609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
1047a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // Not all devices can support a preview callback stream and a recording
1048a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // stream at the same time, so assume none of them can.
1049a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    if (mCallbackProcessor->getStreamId() != NO_STREAM) {
1050a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        ALOGV("%s: Camera %d: Clearing out callback stream before "
1051a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                "creating recording stream", __FUNCTION__, mCameraId);
1052a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        res = mStreamingProcessor->stopStream();
1053a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (res != OK) {
1054a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream",
1055a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1056a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            return res;
1057a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
1058a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        res = mCallbackProcessor->deleteStream();
1059a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (res != OK) {
1060a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to delete callback stream before "
1061a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    "record: %s (%d)", __FUNCTION__, mCameraId,
1062a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    strerror(-res), res);
1063a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            return res;
1064a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
1065a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    }
1066ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh
1067dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    // On current HALs, clean up ZSL before transitioning into recording
1068dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    if (mDeviceVersion != CAMERA_DEVICE_API_VERSION_2_0) {
1069dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        if (mZslProcessor->getStreamId() != NO_STREAM) {
1070dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            ALOGV("%s: Camera %d: Clearing out zsl stream before "
1071dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                    "creating recording stream", __FUNCTION__, mCameraId);
1072dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            res = mStreamingProcessor->stopStream();
1073dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            if (res != OK) {
1074dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream",
1075dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        __FUNCTION__, mCameraId);
1076dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                return res;
1077dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            }
1078dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            res = mDevice->waitUntilDrained();
1079dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            if (res != OK) {
1080dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
1081dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
1082dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            }
1083dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            res = mZslProcessor->clearZslQueue();
1084dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            if (res != OK) {
1085dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                ALOGE("%s: Camera %d: Can't clear zsl queue",
1086dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        __FUNCTION__, mCameraId);
1087dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                return res;
1088dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            }
1089dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            res = mZslProcessor->deleteStream();
1090dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            if (res != OK) {
1091dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete zsl stream before "
1092dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        "record: %s (%d)", __FUNCTION__, mCameraId,
1093dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        strerror(-res), res);
1094dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                return res;
1095dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            }
1096ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        }
1097ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh    }
1098ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh
1099a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // Disable callbacks if they're enabled; can't record and use callbacks,
1100a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // and we can't fail record start without stagefright asserting.
1101a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    params.previewCallbackFlags = 0;
1102a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
1103dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    if (mDeviceVersion != CAMERA_DEVICE_API_VERSION_2_0) {
1104dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        // For newer devices, may need to reconfigure video snapshot JPEG sizes
1105dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        // during recording startup, so need a more complex sequence here to
1106dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        // ensure an early stream reconfiguration doesn't happen
1107dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        bool recordingStreamNeedsUpdate;
1108dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        res = mStreamingProcessor->recordingStreamNeedsUpdate(params, &recordingStreamNeedsUpdate);
1109a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        if (res != OK) {
1110dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            ALOGE("%s: Camera %d: Can't query recording stream",
1111a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh                    __FUNCTION__, mCameraId);
1112a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh            return res;
1113a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        }
1114dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala
1115dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        if (recordingStreamNeedsUpdate) {
1116dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            // Need to stop stream here so updateProcessorStream won't trigger configureStream
1117dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            // Right now camera device cannot handle configureStream failure gracefully
1118dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            // when device is streaming
1119dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            res = mStreamingProcessor->stopStream();
1120dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            if (res != OK) {
1121dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming to update record "
1122dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        "stream", __FUNCTION__, mCameraId);
1123dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                return res;
1124dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            }
1125dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            res = mDevice->waitUntilDrained();
1126dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            if (res != OK) {
1127dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                ALOGE("%s: Camera %d: Waiting to stop streaming failed: "
1128dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId,
1129dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        strerror(-res), res);
1130dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            }
1131dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala
1132dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            res = updateProcessorStream<
1133dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                    StreamingProcessor,
1134dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                    &StreamingProcessor::updateRecordingStream>(
1135dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        mStreamingProcessor,
1136dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        params);
1137dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            if (res != OK) {
1138dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to update recording stream: "
1139dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId,
1140dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                        strerror(-res), res);
1141dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                return res;
1142dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            }
1143a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        }
1144dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    } else {
1145dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        // Maintain call sequencing for HALv2 devices.
1146a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        res = updateProcessorStream<
1147a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh                StreamingProcessor,
1148a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh                &StreamingProcessor::updateRecordingStream>(mStreamingProcessor,
1149dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala                    params);
1150a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        if (res != OK) {
1151a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh            ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
1152a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh                    __FUNCTION__, mCameraId, strerror(-res), res);
1153a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh            return res;
1154a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        }
1155a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    }
1156a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh
1157d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    Vector<int32_t> outputStreams;
115873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
115973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getRecordingStreamId());
11609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
116173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
116273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            outputStreams);
11633ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
1164a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    // startStream might trigger a configureStream call and device might fail
1165a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    // configureStream due to jpeg size > video size. Try again with jpeg size overridden
1166a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    // to video size.
1167a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    if (res == BAD_VALUE) {
1168a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        overrideVideoSnapshotSize(params);
11693ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
11703ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh                outputStreams);
11713ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
11723ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
11739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
117473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
11759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
11769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
11779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
11789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
11802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
1181228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
11829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
118461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
118561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
118661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
1187a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11889e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
118944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
1191228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
11929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
11933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
11943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
11979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
11989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
11992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
12002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
12012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
12022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
12039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
12049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
12052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
12062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
12079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
12089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
12099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1210609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
1211609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
1212092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh    // Remove recording stream to prevent it from slowing down takePicture later
1213092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh    if (!l.mParameters.recordingHint && l.mParameters.isJpegSizeOverridden()) {
1214092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        res = stopStream();
1215092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        if (res != OK) {
1216092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh            ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)",
1217092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    __FUNCTION__, mCameraId, strerror(-res), res);
1218092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        }
1219092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        res = mDevice->waitUntilDrained();
1220092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        if (res != OK) {
1221092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh            ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
1222092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    __FUNCTION__, mCameraId, strerror(-res), res);
1223092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        }
1224092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        // Clean up recording stream
1225092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        res = mStreamingProcessor->deleteRecordingStream();
1226092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        if (res != OK) {
1227092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh            ALOGE("%s: Camera %d: Unable to delete recording stream before "
1228092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    "stop preview: %s (%d)",
1229092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    __FUNCTION__, mCameraId, strerror(-res), res);
1230092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        }
1231092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh        l.mParameters.recoverOverriddenJpegSize();
1232092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh    }
1233092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh
12345a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    res = startPreviewL(l.mParameters, true);
12359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
12365a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to return to preview",
12375a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                __FUNCTION__, mCameraId);
12389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
123961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
124061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
124161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
1242a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
124344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
12448da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
12453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
12463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
12478da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
12488da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
12498da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
12508da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
12518da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
12522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12538da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
12542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
125661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
125761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
125861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
1259a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
126044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
12613a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
126230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
126373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->releaseRecordingFrame(mem);
126461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
126561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
126661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
1267a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
126844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
12698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
12703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
12713a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
12723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1273174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1274d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    bool notifyImmediately = false;
1275d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    bool notifySuccess = false;
1276174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
12772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
12784865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        if (l.mParameters.state < Parameters::PREVIEW) {
1279f79f8ca07f9130d67ba575748cf3481f32dcad9fZhijun He            ALOGE("%s: Camera %d: Call autoFocus when preview is inactive (state = %d).",
1280f79f8ca07f9130d67ba575748cf3481f32dcad9fZhijun He                    __FUNCTION__, mCameraId, l.mParameters.state);
12814865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            return INVALID_OPERATION;
12824865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        }
12834865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
12845f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        /**
12855f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * If the camera does not support auto-focus, it is a no-op and
12865f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * onAutoFocus(boolean, Camera) callback will be called immediately
12875f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * with a fake value of success set to true.
12889454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          *
12899454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          * Similarly, if focus mode is set to INFINITY, there's no reason to
12909454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          * bother the HAL.
12915f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          */
12929454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
12939454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
1294d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifyImmediately = true;
1295d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifySuccess = true;
1296d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        }
1297d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1298d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * If we're in CAF mode, and AF has already been locked, just fire back
1299d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * the callback right away; the HAL would not send a notification since
1300d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * no state change would happen on a AF trigger.
1301d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
1302d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE ||
1303d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) &&
1304d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) {
1305d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifyImmediately = true;
1306d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifySuccess = true;
1307d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        }
1308d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1309d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * Send immediate notification back to client
1310d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
1311d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        if (notifyImmediately) {
131244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
131344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            if (l.mRemoteCallback != 0) {
131444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1315d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                        notifySuccess ? 1 : 0, 0);
13165f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            }
13175f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            return OK;
13185f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        }
1319d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1320d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * Handle quirk mode for AF in scene modes
1321d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
132295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        if (l.mParameters.quirks.triggerAfWithAuto &&
1323c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk                l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED &&
1324ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala                l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO &&
1325ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala                !l.mParameters.focusingAreas[0].isEmpty()) {
132695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
132795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                    __FUNCTION__, l.mParameters.focusMode);
132895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.shadowFocusMode = l.mParameters.focusMode;
132995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
133095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            updateRequests(l.mParameters);
133195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        }
133295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala
13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
13342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
1335174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
13362b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    ATRACE_ASYNC_BEGIN(kAutofocusLabel, triggerId);
13372b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
13384865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
1339174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1340174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
1341174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
13426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
134361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
134461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
134561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
1346a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
134744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
13488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
13493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
13503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
13513a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1352174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1353174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
13542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
13559454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        // Canceling does nothing in FIXED or INFINITY modes
13569454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
13579454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
13589454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala            return OK;
13599454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        }
13602b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
13612b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // An active AF trigger is canceled
13622b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (l.mParameters.afTriggerCounter == l.mParameters.currentAfTriggerId) {
13632b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_END(kAutofocusLabel, l.mParameters.currentAfTriggerId);
13642b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
13652b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
13662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
136795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala
136895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        // When using triggerAfWithAuto quirk, may need to reset focus mode to
1369ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala        // the real state at this point. No need to cancel explicitly if
1370ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala        // changing the AF mode.
137195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
137295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
137395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                    l.mParameters.shadowFocusMode);
137495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.focusMode = l.mParameters.shadowFocusMode;
137595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
137695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            updateRequests(l.mParameters);
1377ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala
1378ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala            return OK;
137995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        }
1380dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh        if (l.mParameters.zslMode) {
1381dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh            mZslProcessor->clearZslQueue();
1382dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh        }
1383174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
13844865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
1385174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1386174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1387174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
13886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
138961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
139061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1391ff82370c7c04340d50673d425f48acafd00f2bc9Ben Murdochstatus_t Camera2Client::takePicture(int msgType) {
1392a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
139344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
1394d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
13953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1396d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
13972b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    int takePictureCounter;
1398b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala    {
1399b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        SharedParameters::Lock l(mParameters);
1400b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        switch (l.mParameters.state) {
1401b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::DISCONNECTED:
1402b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::STOPPED:
1403b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1404b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1405da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        __FUNCTION__, mCameraId);
1406b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                return INVALID_OPERATION;
1407b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::PREVIEW:
1408b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                // Good to go for takePicture
1409b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                res = commandStopFaceDetectionL(l.mParameters);
1410b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                if (res != OK) {
1411b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1412b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                            __FUNCTION__, mCameraId);
1413b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    return res;
1414b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                }
1415b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                l.mParameters.state = Parameters::STILL_CAPTURE;
1416092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh
1417092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                // Remove recording stream to prevent video snapshot jpeg logic kicking in
1418092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                if (l.mParameters.isJpegSizeOverridden() &&
1419092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                        mStreamingProcessor->getRecordingStreamId() != NO_STREAM) {
1420092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    res = mStreamingProcessor->togglePauseStream(/*pause*/true);
1421092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    if (res != OK) {
1422092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                        ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
1423092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                                __FUNCTION__, mCameraId, strerror(-res), res);
1424092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    }
1425092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    res = mDevice->waitUntilDrained();
1426092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    if (res != OK) {
1427092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                        ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
1428092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                                __FUNCTION__, mCameraId, strerror(-res), res);
1429092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    }
1430092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    // Clean up recording stream
1431092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    res = mStreamingProcessor->deleteRecordingStream();
1432092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    if (res != OK) {
1433092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                        ALOGE("%s: Camera %d: Unable to delete recording stream before "
1434092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                                "stop preview: %s (%d)",
1435092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                                __FUNCTION__, mCameraId, strerror(-res), res);
1436092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    }
1437092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    res = mStreamingProcessor->togglePauseStream(/*pause*/false);
1438092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    if (res != OK) {
1439092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                        ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)",
1440092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                                __FUNCTION__, mCameraId, strerror(-res), res);
1441092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    }
1442092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    l.mParameters.recoverOverriddenJpegSize();
1443092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                }
1444b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                break;
1445b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::RECORD:
1446b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                // Good to go for video snapshot
1447b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1448b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                break;
1449b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::STILL_CAPTURE:
1450b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
1451b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                ALOGE("%s: Camera %d: Already taking a picture",
1452b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                        __FUNCTION__, mCameraId);
1453b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                return INVALID_OPERATION;
1454b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        }
1455d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1456b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1457d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1458e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        int lastJpegStreamId = mJpegProcessor->getStreamId();
1459dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = updateProcessorStream(mJpegProcessor, l.mParameters);
1460d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh        // If video snapshot fail to configureStream, try override video snapshot size to
1461d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh        // video size
1462d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh        if (res == BAD_VALUE && l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
1463d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh            overrideVideoSnapshotSize(l.mParameters);
1464d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh            res = updateProcessorStream(mJpegProcessor, l.mParameters);
1465d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh        }
1466b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        if (res != OK) {
1467b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1468b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1469b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            return res;
1470b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        }
14712b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        takePictureCounter = ++l.mParameters.takePictureCounter;
1472e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He
1473e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        // Clear ZSL buffer queue when Jpeg size is changed.
1474e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        bool jpegStreamChanged = mJpegProcessor->getStreamId() != lastJpegStreamId;
1475e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        if (l.mParameters.zslMode && jpegStreamChanged) {
1476e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            ALOGV("%s: Camera %d: Clear ZSL buffer queue when Jpeg size is changed",
1477e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                    __FUNCTION__, mCameraId);
1478e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            mZslProcessor->clearZslQueue();
1479e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        }
1480228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
14818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
14822b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    ATRACE_ASYNC_BEGIN(kTakepictureLabel, takePictureCounter);
14832b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
14844865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    // Need HAL to have correct settings before (possibly) triggering precapture
14854865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
14864865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
1487aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin    res = mCaptureSequencer->startCapture(msgType);
1488d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1489da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1490d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1491d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1492d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1493da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return res;
149461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
149561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
149661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1497a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
14988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
149944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
15006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
15013a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
15023a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
15046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
1505dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh    Parameters::focusMode_t focusModeBefore = l.mParameters.focusMode;
15062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
15072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
1508dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh    Parameters::focusMode_t focusModeAfter = l.mParameters.focusMode;
1509dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh
1510dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh    if (l.mParameters.zslMode && focusModeAfter != focusModeBefore) {
1511dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh        mZslProcessor->clearZslQueue();
1512dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh    }
15139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
15158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
151761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1518f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
151961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1520a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
15218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
152244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
1523ebe865b175b3f1b2a9212cea7b008937c919d8f3Igor Murashkin    // The camera service can unconditionally get the parameters at all times
1524ebe865b175b3f1b2a9212cea7b008937c919d8f3Igor Murashkin    if (getCallingPid() != mServicePid && checkPid(__FUNCTION__) != OK) return String8();
1525ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
15262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1527ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
15288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    return l.mParameters.get();
152961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
153061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
153161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1532a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
153344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
15343a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
15353a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1536c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1537c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1538c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1539c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
154036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
154136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
154236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
154336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
154436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
154536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
154636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
154736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
154836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
154936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
155036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
155136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
155236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1553228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1556228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
155736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
155836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
155936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
156036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
156136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
156236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
156336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
156436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
156536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1566c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
156736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
156836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
156936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
157036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
157136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
157236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
157336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
157436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
157536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
157636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
157736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
157836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
157936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
158036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
15812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
158236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
158336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
158436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
158536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
158636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
158736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
159073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            getPreviewStreamId() != NO_STREAM) {
159173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mDevice->setStreamTransform(getPreviewStreamId(), transform);
159236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
159436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
159536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
159636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
159736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
159936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
16002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1601c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
160236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1603983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
1604a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin    // the camera2 api legacy mode can unconditionally disable the shutter sound
1605a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin    if (mLegacyMode) {
1606a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin        ALOGV("%s: Disable shutter sound in legacy mode", __FUNCTION__);
1607a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin        l.mParameters.playShutterSound = false;
1608a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin        return OK;
1609a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin    }
1610a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin
161136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
161236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
161336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
161436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
161536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
161636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
161736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
161836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
161936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
162036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
162136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1622983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
162336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1624983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
162636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
162736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1628983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
162936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
163036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
163136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
163236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
163336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1634ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinstatus_t Camera2Client::commandStartFaceDetectionL(int /*type*/) {
16358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
16368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
16378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
16382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
16392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
16402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
16412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
16422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
16432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
16448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
16458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
16468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
16472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
16482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
16492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
16508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
16518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
16528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
16542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
1655d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
16568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
16578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
1658caf3a9c1447f602c658f558025b90413d1b4114dZiv Hendel        return BAD_VALUE;
16598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
16618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
16638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
16658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
166736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
166836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1669228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
16708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
16718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
16728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
16738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1674228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
16758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1676228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
16778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
16792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
16802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1681228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
16828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
168536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
168636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
168736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
16882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
16892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1690174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
169136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
169236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
169336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
169436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
169536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
16962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
16972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1698983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
169936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
170036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
170136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
170236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
170336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
170436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
17058da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
170636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
170736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
170836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1709c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1710c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
171173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->setRecordingBufferCount(count);
171261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
171361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
17143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
1715160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1716160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1717160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1718174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1719174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1720174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1721174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1722174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1723174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
17242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
17252b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Trace end of AF state
17262b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        char tmp[32];
17272b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (l.mParameters.afStateCounter > 0) {
17282b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            camera_metadata_enum_snprint(
17292b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala                ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp));
17302b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_END(tmp, l.mParameters.afStateCounter);
17312b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
17322b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
17332b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Update state
1734d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        l.mParameters.focusState = newState;
17352b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        l.mParameters.afStateCounter++;
17362b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
17372b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Trace start of AF state
17382b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
17392b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        camera_metadata_enum_snprint(
17402b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp));
17412b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        ATRACE_ASYNC_BEGIN(tmp, l.mParameters.afStateCounter);
17422b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
17432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1744174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1745174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1746174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1747174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1748174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
17492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1750174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1751174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1752174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1753174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1754174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1755174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
17562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1757174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1758174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1759174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1760174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1761174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1762174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1763174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
17644ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
1765174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1766174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1767174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1768174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1769174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1770174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1771174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1772174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1773174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1774174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1775174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1776174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1777174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1778174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1779174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1780174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1781174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1782174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1783174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
17842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1785174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1786174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
17872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
17882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1789174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1790174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
17912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1792174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1793174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1794174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1795174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1796174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
17972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
17982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1799174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1800174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1801174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1802174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1803174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1804174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1805174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1806174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
18074ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
1808174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
18092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1810174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1811174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1812174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1813174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
18142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1815174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1816174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1817174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1818174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1819174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1820174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1821a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1822a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1823a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1824a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1825174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1826174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1827174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1828174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
182944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
183044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        if (l.mRemoteCallback != 0) {
183144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
18328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
18338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1834174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1835603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
18362b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        ATRACE_ASYNC_END(kAutofocusLabel, triggerId);
183744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
183844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        if (l.mRemoteCallback != 0) {
183944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1840a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
18418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1842603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1843160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1844160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1845160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1846160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1847160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1848da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1849160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1850160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1851a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1852a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1853c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1854c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1855da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const {
185673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getPreviewStreamId();
1857da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1858da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1859da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const {
1860da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mJpegProcessor->getStreamId();
1861da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1862da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1863da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const {
1864da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mCallbackProcessor->getStreamId();
1865da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1866da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1867da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const {
186873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getRecordingStreamId();
1869da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1870da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1871da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getZslStreamId() const {
1872da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mZslProcessor->getStreamId();
1873da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1874da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
18754865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
187625a0aef19e170d2695f64b4c48296e7914155a88Zhijun He        wp<camera2::FrameProcessor::FilteredListener> listener, bool sendPartials) {
187725a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    return mFrameProcessor->registerListener(minId, maxId, listener, sendPartials);
18784865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
18794865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
18804865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1881da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
18824865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mFrameProcessor->removeListener(minId, maxId, listener);
1883da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1884da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
18854865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::stopStream() {
18864865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mStreamingProcessor->stopStream();
1887da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1888da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
18894865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart;
18904865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd;
18914865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart;
18924865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd;
18934865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart;
18944865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd;
1895da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
18963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
18973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
18985a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters &params) {
18998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
19008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
190122d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
190222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
19034865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mStreamingProcessor->incrementStreamingIds();
19044865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res != OK) {
19054865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
19064865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
19074865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        return res;
19084865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
19094865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
191073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewRequest(params);
19118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
19128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
19138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
19148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
19158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
191673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updateRecordingRequest(params);
19178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
19188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
19198ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
19208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
19218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
19228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
19232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
19245a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        res = startPreviewL(params, true);
19258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
19268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
19278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
19288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
19298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
19302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
19312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
193273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = startRecordingL(params, true);
19338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
19348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
19358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
19368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
19378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
19388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
19398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
19408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
19418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
19429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1943228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
1944228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
1945228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
1946228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1947228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1948228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1949228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
1950228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1951228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1952228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1953228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
1954f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1955228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
1956228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
1957228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1958228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
1959228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1960228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
1961228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
1962228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1963228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1964228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
1965228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
1966228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
1967228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
1968228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1969228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
19708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
19714865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::syncWithDevice() {
19724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    ATRACE_CALL();
197343b7ac6bd1a949ecb8ffc7e50d0a2f01a6258034Eino-Ville Talvala    const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms
19744865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
19754865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
19764865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
19774865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (activeRequestId == 0) return OK;
19784865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
19794865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
19804865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res == TIMED_OUT) {
19814865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
19824865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
19834865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    } else if (res != OK) {
19844865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
19854865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
19864865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
19874865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return res;
19884865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
19894865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
1990dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkintemplate <typename ProcessorT>
1991dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
1992dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                                              camera2::Parameters params) {
199382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    // No default template arguments until C++11, so we need this overload
199482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>(
199582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            processor, params);
199682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin}
199782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin
199882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkintemplate <typename ProcessorT,
199982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin          status_t (ProcessorT::*updateStreamF)(const Parameters &)>
200082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
200182db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin                                              Parameters params) {
2002dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    status_t res;
2003dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
200482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    // Get raw pointer since sp<T> doesn't have operator->*
200582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    ProcessorT *processorPtr = processor.get();
200682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    res = (processorPtr->*updateStreamF)(params);
2007dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
2008dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    /**
2009dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * Can't update the stream if it's busy?
2010dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     *
2011dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * Then we need to stop the device (by temporarily clearing the request
2012dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * queue) and then try again. Resume streaming once we're done.
2013dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     */
2014dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    if (res == -EBUSY) {
2015a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        ALOGV("%s: Camera %d: Pausing to update stream", __FUNCTION__,
2016a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                mCameraId);
2017dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mStreamingProcessor->togglePauseStream(/*pause*/true);
2018dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
2019dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
2020dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
2021dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
2022dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
2023dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mDevice->waitUntilDrained();
2024dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
2025dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
2026dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
2027dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
2028dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
202982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin        res = (processorPtr->*updateStreamF)(params);
2030dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
2031dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Failed to update processing stream "
2032dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                  " despite having halted streaming first: %s (%d)",
2033dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                  __FUNCTION__, mCameraId, strerror(-res), res);
2034dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
2035dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
2036dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mStreamingProcessor->togglePauseStream(/*pause*/false);
2037dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
2038dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)",
2039dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
2040dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
2041dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    }
2042dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
2043dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    return res;
2044dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin}
204544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
2046a53021f776d0c82271727e5817388936513feb92Yin-Chia Yehstatus_t Camera2Client::overrideVideoSnapshotSize(Parameters &params) {
2047a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    ALOGV("%s: Camera %d: configure still size to video size before recording"
2048a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh            , __FUNCTION__, mCameraId);
2049a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    params.overrideJpegSizeByVideoSize();
2050a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    status_t res = updateProcessorStream(mJpegProcessor, params);
2051a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    if (res != OK) {
2052a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        ALOGE("%s: Camera %d: Can't override video snapshot size to video size: %s (%d)",
2053a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh                __FUNCTION__, mCameraId, strerror(-res), res);
2054a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    }
2055a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    return res;
2056a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh}
2057a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh
20582b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvalaconst char* Camera2Client::kAutofocusLabel = "autofocus";
20592b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvalaconst char* Camera2Client::kTakepictureLabel = "take_picture";
20602b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
206161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
2062