Camera2Client.cpp revision ebe865b175b3f1b2a9212cea7b008937c919d8f3
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,
56cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int servicePid):
5744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        Camera2ClientBase(cameraService, cameraClient, clientPackageName,
58ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                cameraId, cameraFacing, clientPid, clientUid, servicePid),
59cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        mParameters(cameraId, cameraFacing)
60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
61a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
62228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
69a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
70c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
73e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin    res = Camera2ClientBase::initialize(module);
74ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    if (res != OK) {
75ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        return res;
76ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    }
77ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
78fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    {
79fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
80fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
81cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        res = l.mParameters.initialize(&(mDevice->info()), mDeviceVersion);
82fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (res != OK) {
83fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
84fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
85fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            return NO_INIT;
86fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        }
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    String8 threadName;
90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
9173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor = new StreamingProcessor(this);
92254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    threadName = String8::format("C2-%d-StreamProc",
93254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala            mCameraId);
94254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->run(threadName.string());
9573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
96ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    mFrameProcessor = new FrameProcessor(mDevice, this);
974bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-FrameProc",
98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mFrameProcessor->run(threadName.string());
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer = new CaptureSequencer(this);
1024bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CaptureSeq",
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->run(threadName.string());
105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
1074bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-JpegProc",
108ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala            mCameraId);
109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->run(threadName.string());
110ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
111ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    switch (mDeviceVersion) {
112ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        case CAMERA_DEVICE_API_VERSION_2_0: {
113ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            sp<ZslProcessor> zslProc =
114ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin                    new ZslProcessor(this, mCaptureSequencer);
115ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessor = zslProc;
116ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessorThread = zslProc;
117ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            break;
118ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        }
11995dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He        case CAMERA_DEVICE_API_VERSION_3_0:
12095dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He        case CAMERA_DEVICE_API_VERSION_3_1:
12195dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He        case CAMERA_DEVICE_API_VERSION_3_2: {
122ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            sp<ZslProcessor3> zslProc =
123ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin                    new ZslProcessor3(this, mCaptureSequencer);
124ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessor = zslProc;
125ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessorThread = zslProc;
126ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            break;
127ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        }
128ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        default:
129ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            break;
130ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    }
1314bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-ZslProc",
132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
133ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    mZslProcessorThread->run(threadName.string());
134ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
135d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor = new CallbackProcessor(this);
1364bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CallbkProc",
137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCallbackProcessor->run(threadName.string());
139d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala
140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
141fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
142f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
143f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
1442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGD("%s", l.mParameters.paramsFlattened.string());
145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
147f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
14861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
15061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
151a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
152d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala    ALOGV("~Camera2Client");
1534ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
154f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
155f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
156c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    disconnect();
157c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Closed", mCameraId);
15961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
16061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
16161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
162611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
163d0158c38ad82c1c3033a6dd5806435def3727784Eino-Ville Talvala    result.appendFormat("Client2[%d] (%p) Client: %s PID: %d, dump:\n",
164611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
16544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            getRemoteCallback()->asBinder().get(),
166d0158c38ad82c1c3033a6dd5806435def3727784Eino-Ville Talvala            String8(mClientPackageName).string(),
167611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
172836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1754ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
177836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
179836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
181836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
18211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
183836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
185836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
189836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
190836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
192836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
193836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
195836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
196836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
197377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT        result.appendFormat("    GPS timestamp: %" PRId64 "\n",
198836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
200836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
204836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
205d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO)
206d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT)
207d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT)
208d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT)
209d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT)
210d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)
211d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT)
212d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE)
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
217836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
218d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF)
219d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO)
220d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE)
221d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE)
222d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA)
223d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE)
224d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD)
225d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD)
226d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA)
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
231836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
232d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO)
233d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF)
234d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ)
235d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ)
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
240836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
241c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk        case ANDROID_CONTROL_SCENE_MODE_DISABLED:
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
262836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
273836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
285d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    result.append("   Focus state: ");
286d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    switch (p.focusState) {
287d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE)
288d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
289d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
2904ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED)
291d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN)
292d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED)
293d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
294d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        default: result.append("UNKNOWN\n");
295d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    }
296d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala
2977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
298836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
300836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
301836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
302836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
303836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
3057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
308836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
3097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
311836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
312836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
3137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
315836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
3167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
317836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
318836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
319836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
320836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
321836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
3227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
324836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
325836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
326836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
3277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
329836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
3307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
332836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
3337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3340181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    result.appendFormat("    Selected still capture FPS range: %d - %d\n",
3350181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            p.fastInfo.bestStillCaptureFpsRange[0],
3360181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            p.fastInfo.bestStillCaptureFpsRange[1]);
3370181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
3383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
339da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n",
340da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId());
341ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n",
342da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getCaptureStreamId());
343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n",
344da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId());
345e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
346e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    result.append("  Quirks for this camera:\n");
347e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    bool haveQuirk = false;
348e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.triggerAfWithAuto) {
349e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    triggerAfWithAuto\n");
350e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
351e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
352e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.useZslFormat) {
353e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    useZslFormat\n");
354e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
355e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
3567373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (p.quirks.meteringCropRegion) {
3577373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        result.appendFormat("    meteringCropRegion\n");
3587373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        haveQuirk = true;
3597373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
360fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (p.quirks.partialResults) {
361fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        result.appendFormat("    usePartialResult\n");
362fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        haveQuirk = true;
363fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
364e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (!haveQuirk) {
365e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    none\n");
366e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
367e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
36873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    write(fd, result.string(), result.size());
3693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
37073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->dump(fd, args);
371428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->dump(fd, args);
373da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
374c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
375c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
37697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala    mZslProcessor->dump(fd, args);
37797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala
37844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    return dumpDevice(fd, args);
3797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
38061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
38361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
385a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
38644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
387c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala
388c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    // Allow both client and the media server to disconnect at all times
389c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    int callingPid = getCallingPid();
390c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    if (callingPid != mClientPid && callingPid != mServicePid) return;
391ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
393f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
39498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Shutting down", mCameraId);
39598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
396d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala    /**
397d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * disconnect() cannot call any methods that might need to promote a
398d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * wp<Camera2Client>, since disconnect can be called from the destructor, at
399d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * which point all such promotions will fail.
400d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     */
401d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala
402d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    stopPreviewL();
4036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
40498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    {
40598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
406c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala        if (l.mParameters.state == Parameters::DISCONNECTED) return;
40798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        l.mParameters.state = Parameters::DISCONNECTED;
40898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    }
40998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
410254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->requestExit();
41198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mFrameProcessor->requestExit();
41298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCaptureSequencer->requestExit();
41398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mJpegProcessor->requestExit();
414ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    mZslProcessorThread->requestExit();
41598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCallbackProcessor->requestExit();
41698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
41798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Waiting for threads", mCameraId);
41898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
419254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->join();
42098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mFrameProcessor->join();
42198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCaptureSequencer->join();
42298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mJpegProcessor->join();
423ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    mZslProcessorThread->join();
42498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCallbackProcessor->join();
42598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
426dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    ALOGV("Camera %d: Deleting streams", mCameraId);
427dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk
428dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mStreamingProcessor->deletePreviewStream();
429dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mStreamingProcessor->deleteRecordingStream();
430dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mJpegProcessor->deleteStream();
431dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mCallbackProcessor->deleteStream();
432dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mZslProcessor->deleteStream();
433dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk
43498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Disconnecting device", mCameraId);
43598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
43698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mDevice->disconnect();
43798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
4383a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
4398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
44061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
44161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
44361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
444a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4459e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
44644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
447ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
4509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
4519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
4568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
45744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    mRemoteCallback = client;
45844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    mSharedCameraCallbacks = client;
4599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
46161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
46261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
46361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
464a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4659e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
46644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
469ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
48261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
48361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
48461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
485a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4869e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
48744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
490ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
492907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        SharedParameters::Lock l(mParameters);
493907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        if (l.mParameters.state == Parameters::RECORD ||
494907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
495907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala            ALOGD("Not allowed to unlock camera during recording.");
496907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala            return INVALID_OPERATION;
497907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        }
4989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
49944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        mRemoteCallback.clear();
50044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        mSharedCameraCallbacks.clear();
5019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
5049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
5069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
50761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
50861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5091ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvalastatus_t Camera2Client::setPreviewTarget(
5108ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
511a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5129e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
51344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
5143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
516ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
5176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
5186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
5198ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    if (bufferProducer != 0) {
5208ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        binder = bufferProducer->asBinder();
5211ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // Using controlledByApp flag to ensure that the buffer queue remains in
5221ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // async mode for the old camera API, where many applications depend
5231ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // on that behavior.
5241ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        window = new Surface(bufferProducer, /*controlledByApp*/ true);
5256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
52636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
5276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
5286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
52936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
530be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
531a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
5359e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
5369e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
5376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
5386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
540f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    Parameters::State state;
541f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    {
542f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        SharedParameters::Lock l(mParameters);
543f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        state = l.mParameters.state;
544f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    }
545f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    switch (state) {
5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
5472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
552f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                    Parameters::getStateName(state));
5539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
560d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            res = stopStream();
561d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            if (res != OK) {
562d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                ALOGE("%s: Unable to stop preview to swap windows: %s (%d)",
563d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                        __FUNCTION__, strerror(-res), res);
564d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                return res;
565d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            }
566f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala            state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
570bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
57173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->setPreviewWindow(window);
57273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (res != OK) {
57373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Unable to set new preview window: %s (%d)",
57473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
57573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        return res;
57673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
577bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
578f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
579f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        SharedParameters::Lock l(mParameters);
580f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        l.mParameters.state = state;
5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
58561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
58661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
58761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
588a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
59044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
591ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin
592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
600a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
601a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    switch(params.state) {
602a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::STOPPED:
603a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
604a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::PREVIEW:
605a2520db02bead68d4980783c41500ae96511bdf8Zhijun He        case Parameters::STILL_CAPTURE:
606a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            // OK
607a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            break;
608a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        default:
609a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (flag & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
610a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't use preview callbacks "
611a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "in state %d", __FUNCTION__, mCameraId, params.state);
612a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return;
613a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
614a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    }
615a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
619228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
620228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
6213ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
622527748abf04c0060894fd7aace54959a2c343435Zhijun He        if (params.previewCallbackSurface && flag != CAMERA_FRAME_CALLBACK_FLAG_NOOP) {
6233ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // Disable any existing preview callback window when enabling
6243ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // preview callback flags
6253ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = mCallbackProcessor->setCallbackWindow(NULL);
6263ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            if (res != OK) {
6273ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to clear preview callback surface:"
6283ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                        " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
6293ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                return;
6303ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            }
6313ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            params.previewCallbackSurface = false;
6323ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        }
6333ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
6353ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
636a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (params.state == Parameters::PREVIEW) {
637228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
638a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
639a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to refresh request in state %s",
640a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        __FUNCTION__, mCameraId,
641a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        Parameters::getStateName(params.state));
642a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
6433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        }
6443ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6453ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala}
6463ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6473ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvalastatus_t Camera2Client::setPreviewCallbackTarget(
6483ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        const sp<IGraphicBufferProducer>& callbackProducer) {
6493ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    ATRACE_CALL();
6503ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
6513ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    Mutex::Autolock icl(mBinderSerializationLock);
6523ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    status_t res;
6533ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6543ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6553ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    sp<ANativeWindow> window;
6563ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (callbackProducer != 0) {
6573ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        window = new Surface(callbackProducer);
6583ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6593ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6603ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    res = mCallbackProcessor->setCallbackWindow(window);
6613ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (res != OK) {
6623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview callback surface: %s (%d)",
6633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6643ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        return res;
6653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6663ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6673ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6683ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6693ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (window != NULL) {
6703ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        // Disable traditional callbacks when a valid callback target is given
6713ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackFlags = CAMERA_FRAME_CALLBACK_FLAG_NOOP;
6723ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackOneShot = false;
6733ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackSurface = true;
6743ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    } else {
6753ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        // Disable callback target if given a NULL interface.
6763ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackSurface = false;
6773ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6783ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6793ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    switch(l.mParameters.state) {
6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
6813ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = startPreviewL(l.mParameters, true);
682228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
6853ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = startRecordingL(l.mParameters, true);
686228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
687228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
688228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
6893ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6903ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (res != OK) {
6913ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to refresh request in state %s",
6923ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                __FUNCTION__, mCameraId,
6933ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                Parameters::getStateName(l.mParameters.state));
694228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
695228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
6963ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    return OK;
69761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
69861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
6993ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
70061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
701a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7029e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
70344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
7043a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7053a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
708d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
709ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
710228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
711d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
7126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
71322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
71422d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
71522d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
716a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala    if ( (params.state == Parameters::PREVIEW ||
717a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                    params.state == Parameters::RECORD ||
718a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                    params.state == Parameters::VIDEO_SNAPSHOT)
719a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala            && !restart) {
720a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        // Succeed attempt to re-enter a streaming state
721a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        ALOGI("%s: Camera %d: Preview already active, ignoring restart",
722a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                __FUNCTION__, mCameraId);
72377449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray        return OK;
72477449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    }
72577449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    if (params.state > Parameters::PREVIEW && !restart) {
7264ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
7294ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
7304ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
7316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
73273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!mStreamingProcessor->haveValidPreviewWindow()) {
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
7346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
7356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
737c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    int lastPreviewStreamId = mStreamingProcessor->getPreviewStreamId();
7389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
73973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewStream(params);
740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
742be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
743be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
7446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
74573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
746c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    bool previewStreamChanged = mStreamingProcessor->getPreviewStreamId() != lastPreviewStreamId;
747c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He
748a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // We could wait to create the JPEG output stream until first actual use
749a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // (first takePicture call). However, this would substantially increase the
750a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // first capture latency on HAL3 devices, and potentially on some HAL2
751a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // devices. So create it unconditionally at preview start. As a drawback,
752a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // this increases gralloc memory consumption for applications that don't
753a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // ever take a picture.
754a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // TODO: Find a better compromise, though this likely would involve HAL
755a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // changes.
756e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He    int lastJpegStreamId = mJpegProcessor->getStreamId();
757a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    res = updateProcessorStream(mJpegProcessor, params);
758a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    if (res != OK) {
759a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala        ALOGE("%s: Camera %d: Can't pre-configure still image "
760a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                "stream: %s (%d)",
761a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
762a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala        return res;
763a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    }
764e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He    bool jpegStreamChanged = mJpegProcessor->getStreamId() != lastJpegStreamId;
765a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala
766d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    Vector<int32_t> outputStreams;
7673ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    bool callbacksEnabled = (params.previewCallbackFlags &
7683ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ||
7693ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            params.previewCallbackSurface;
7703ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
771228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
772a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        // Can't have recording stream hanging around when enabling callbacks,
773a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        // since it exceeds the max stream count on some devices.
774a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (mStreamingProcessor->getRecordingStreamId() != NO_STREAM) {
775a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGV("%s: Camera %d: Clearing out recording stream before "
776a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    "creating callback stream", __FUNCTION__, mCameraId);
777a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            res = mStreamingProcessor->stopStream();
778a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
779a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming to delete "
780a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "recording stream", __FUNCTION__, mCameraId);
781a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return res;
782a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
783a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            res = mStreamingProcessor->deleteRecordingStream();
784a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
785a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete recording stream before "
786a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "enabling callbacks: %s (%d)", __FUNCTION__, mCameraId,
787a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        strerror(-res), res);
788a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return res;
789a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
790a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
791a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
792d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
793228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
794228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
795228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
796228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
797228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
79873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getCallbackStreamId());
799c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    } else if (previewStreamChanged && mCallbackProcessor->getStreamId() != NO_STREAM) {
800c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        /**
801c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * Delete the unused callback stream when preview stream is changed and
802c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * preview is not enabled. Don't need stop preview stream as preview is in
803c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * STOPPED state now.
804c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         */
805c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        ALOGV("%s: Camera %d: Delete unused preview callback stream.",  __FUNCTION__, mCameraId);
806c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        res = mCallbackProcessor->deleteStream();
807c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        if (res != OK) {
808c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            ALOGE("%s: Camera %d: Unable to delete callback stream %s (%d)",
809c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He                    __FUNCTION__, mCameraId, strerror(-res), res);
810c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            return res;
811c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        }
812228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
813ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh
814ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh    if (params.zslMode && !params.recordingHint &&
815ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            getRecordingStreamId() == NO_STREAM) {
816dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = updateProcessorStream(mZslProcessor, params);
817da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
818da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
819da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
820da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
821da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
822e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He
823e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        if (jpegStreamChanged) {
824e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            ALOGV("%s: Camera %d: Clear ZSL buffer queue when Jpeg size is changed",
825e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                    __FUNCTION__, mCameraId);
826e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            mZslProcessor->clearZslQueue();
827e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        }
82873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getZslStreamId());
829661076292093f82aec488baf8460cdf204a5efd2Zhijun He    } else {
830661076292093f82aec488baf8460cdf204a5efd2Zhijun He        mZslProcessor->deleteStream();
831da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
8326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
83373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
83473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
8355a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    if (!params.recordingHint) {
83673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
83773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updatePreviewRequest(params);
8385a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            if (res != OK) {
83973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request: "
84073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId,
84173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
8425a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                return res;
8435a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            }
8445a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        }
84573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
84673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
8475a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    } else {
84873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
84973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updateRecordingRequest(params);
85073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            if (res != OK) {
85173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request with "
85273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "record hint: %s (%d)", __FUNCTION__, mCameraId,
85373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
85473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                return res;
85573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            }
85673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
85773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
85873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
859be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
860be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
86173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
862be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
8646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
8676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
86861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
86961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
87061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
871a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8729e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
87344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
8743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
87636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
877ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
878ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
87936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
880ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
8814865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
882d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds
8832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
884228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
8862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
887228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
888228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
889228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
891ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            // Nothing to do.
892d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
8932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
894d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
8952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
896d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout);
897d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            // no break
8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
900a27c4aa222c8dd1712617dad954c5f3aa68d5427Ruben Brunk            syncWithDevice();
901d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            res = stopStream();
902d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            if (res != OK) {
903d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)",
904d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
905d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            }
9064865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            res = mDevice->waitUntilDrained();
9074865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            if (res != OK) {
9084865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
9094865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
9104865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            }
91128d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            // Clean up recording stream
91228d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            res = mStreamingProcessor->deleteRecordingStream();
91328d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            if (res != OK) {
91428d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh                ALOGE("%s: Camera %d: Unable to delete recording stream before "
91528d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh                        "stop preview: %s (%d)",
91628d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh                        __FUNCTION__, mCameraId, strerror(-res), res);
91728d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            }
918228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
9192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
9202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
9212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
9222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
923d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
924228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
925d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
926d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
927228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
928d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
92961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
93061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
93161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
932a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
93344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9343a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9353a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
9363a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
93961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
94061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
94161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
942a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
94344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9443a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
9492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
95178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
9522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
95478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
95578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
95678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
95778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
95878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
95978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
96178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
96278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
96361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
96461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
96561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
966a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9679e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
96844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
9703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
972228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
9732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
974228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
9753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
976228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
977228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
97822d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
97922d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
98022d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
981228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
9822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
983228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
9849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
9859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
9879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
9889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
991228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
992228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
993228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
9949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
9969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
9999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
10009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
10019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1002228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
100378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
100478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
100578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
100678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
100778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
100878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
100973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!restart) {
101073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mCameraService->playSound(CameraService::SOUND_RECORDING);
101173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mStreamingProcessor->updateRecordingRequest(params);
101273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (res != OK) {
101373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
101473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
101573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            return res;
101673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
101773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
1018609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
1019a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // Not all devices can support a preview callback stream and a recording
1020a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // stream at the same time, so assume none of them can.
1021a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    if (mCallbackProcessor->getStreamId() != NO_STREAM) {
1022a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        ALOGV("%s: Camera %d: Clearing out callback stream before "
1023a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                "creating recording stream", __FUNCTION__, mCameraId);
1024a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        res = mStreamingProcessor->stopStream();
1025a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (res != OK) {
1026a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream",
1027a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1028a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            return res;
1029a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
1030a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        res = mCallbackProcessor->deleteStream();
1031a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (res != OK) {
1032a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to delete callback stream before "
1033a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    "record: %s (%d)", __FUNCTION__, mCameraId,
1034a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    strerror(-res), res);
1035a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            return res;
1036a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
1037a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    }
1038ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh
1039ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh    if (mZslProcessor->getStreamId() != NO_STREAM) {
1040ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        ALOGV("%s: Camera %d: Clearing out zsl stream before "
1041ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh                "creating recording stream", __FUNCTION__, mCameraId);
1042ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        res = mStreamingProcessor->stopStream();
1043ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        if (res != OK) {
1044ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream",
1045ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh                    __FUNCTION__, mCameraId);
1046ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            return res;
1047ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        }
1048ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        res = mDevice->waitUntilDrained();
1049ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        if (res != OK) {
1050ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
1051ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh                    __FUNCTION__, mCameraId, strerror(-res), res);
1052ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        }
1053ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        res = mZslProcessor->clearZslQueue();
1054ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        if (res != OK) {
1055ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            ALOGE("%s: Camera %d: Can't clear zsl queue",
1056ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh                    __FUNCTION__, mCameraId);
1057ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            return res;
1058ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        }
1059ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        res = mZslProcessor->deleteStream();
1060ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        if (res != OK) {
1061ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            ALOGE("%s: Camera %d: Unable to delete zsl stream before "
1062ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh                    "record: %s (%d)", __FUNCTION__, mCameraId,
1063ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh                    strerror(-res), res);
1064ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            return res;
1065ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        }
1066ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh    }
1067ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh
1068a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // Disable callbacks if they're enabled; can't record and use callbacks,
1069a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // and we can't fail record start without stagefright asserting.
1070a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    params.previewCallbackFlags = 0;
1071a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
107282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    res = updateProcessorStream<
107382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            StreamingProcessor,
107482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            &StreamingProcessor::updateRecordingStream>(mStreamingProcessor,
107582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin                                                        params);
10769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
10779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
10789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
10799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
10809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
108173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
1082d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    Vector<int32_t> outputStreams;
108373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
108473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getRecordingStreamId());
10859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
108673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
108773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            outputStreams);
10889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
108973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
10909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
10919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
10929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
10939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
10942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
10952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
1096228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
10979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
10989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
109961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
110061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
110161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
1102a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11039e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
110444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
1106228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
11079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
11083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
11093a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
11112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
11129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
11139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
11142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
11152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
11162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
11172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
11189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
11199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
11202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
11212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
11229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
11239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
11249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1125609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
1126609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
11275a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    res = startPreviewL(l.mParameters, true);
11289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
11295a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to return to preview",
11305a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                __FUNCTION__, mCameraId);
11319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
113261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
113361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
113461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
1135a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
113644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11378da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
11383a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
11393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11408da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
11418da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
11428da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
11438da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
11448da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
11452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11468da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
11472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
11482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
114961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
115061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
115161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
1152a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
115344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11543a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
115530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
115673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->releaseRecordingFrame(mem);
115761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
115861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
115961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
1160a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
116144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
11633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
11643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1166174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1167d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    bool notifyImmediately = false;
1168d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    bool notifySuccess = false;
1169174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
11714865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        if (l.mParameters.state < Parameters::PREVIEW) {
11724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            return INVALID_OPERATION;
11734865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        }
11744865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
11755f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        /**
11765f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * If the camera does not support auto-focus, it is a no-op and
11775f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * onAutoFocus(boolean, Camera) callback will be called immediately
11785f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * with a fake value of success set to true.
11799454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          *
11809454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          * Similarly, if focus mode is set to INFINITY, there's no reason to
11819454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          * bother the HAL.
11825f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          */
11839454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
11849454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
1185d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifyImmediately = true;
1186d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifySuccess = true;
1187d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        }
1188d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1189d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * If we're in CAF mode, and AF has already been locked, just fire back
1190d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * the callback right away; the HAL would not send a notification since
1191d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * no state change would happen on a AF trigger.
1192d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
1193d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE ||
1194d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) &&
1195d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) {
1196d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifyImmediately = true;
1197d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifySuccess = true;
1198d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        }
1199d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1200d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * Send immediate notification back to client
1201d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
1202d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        if (notifyImmediately) {
120344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
120444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            if (l.mRemoteCallback != 0) {
120544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1206d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                        notifySuccess ? 1 : 0, 0);
12075f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            }
12085f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            return OK;
12095f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        }
1210d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1211d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * Handle quirk mode for AF in scene modes
1212d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
121395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        if (l.mParameters.quirks.triggerAfWithAuto &&
1214c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk                l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED &&
1215ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala                l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO &&
1216ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala                !l.mParameters.focusingAreas[0].isEmpty()) {
121795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
121895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                    __FUNCTION__, l.mParameters.focusMode);
121995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.shadowFocusMode = l.mParameters.focusMode;
122095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
122195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            updateRequests(l.mParameters);
122295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        }
122395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala
12242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
12252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
1226174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
12272b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    ATRACE_ASYNC_BEGIN(kAutofocusLabel, triggerId);
12282b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
12294865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
1230174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1231174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
1232174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
12336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
123461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
123561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
123661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
1237a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
123844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
12398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
12403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
12413a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
12423a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1243174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1244174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
12452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
12469454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        // Canceling does nothing in FIXED or INFINITY modes
12479454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
12489454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
12499454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala            return OK;
12509454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        }
12512b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
12522b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // An active AF trigger is canceled
12532b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (l.mParameters.afTriggerCounter == l.mParameters.currentAfTriggerId) {
12542b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_END(kAutofocusLabel, l.mParameters.currentAfTriggerId);
12552b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
12562b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
125895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala
125995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        // When using triggerAfWithAuto quirk, may need to reset focus mode to
1260ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala        // the real state at this point. No need to cancel explicitly if
1261ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala        // changing the AF mode.
126295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
126395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
126495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                    l.mParameters.shadowFocusMode);
126595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.focusMode = l.mParameters.shadowFocusMode;
126695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
126795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            updateRequests(l.mParameters);
1268ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala
1269ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala            return OK;
127095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        }
1271174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
12724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
1273174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1274174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1275174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
12766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
127761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
127861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1279ff82370c7c04340d50673d425f48acafd00f2bc9Ben Murdochstatus_t Camera2Client::takePicture(int msgType) {
1280a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
128144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
1282d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
12833a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1284d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
12852b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    int takePictureCounter;
1286b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala    {
1287b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        SharedParameters::Lock l(mParameters);
1288b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        switch (l.mParameters.state) {
1289b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::DISCONNECTED:
1290b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::STOPPED:
1291b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1292b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1293da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        __FUNCTION__, mCameraId);
1294b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                return INVALID_OPERATION;
1295b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::PREVIEW:
1296b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                // Good to go for takePicture
1297b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                res = commandStopFaceDetectionL(l.mParameters);
1298b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                if (res != OK) {
1299b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1300b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                            __FUNCTION__, mCameraId);
1301b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    return res;
1302b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                }
1303b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                l.mParameters.state = Parameters::STILL_CAPTURE;
1304b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                break;
1305b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::RECORD:
1306b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                // Good to go for video snapshot
1307b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1308b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                break;
1309b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::STILL_CAPTURE:
1310b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
1311b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                ALOGE("%s: Camera %d: Already taking a picture",
1312b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                        __FUNCTION__, mCameraId);
1313b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                return INVALID_OPERATION;
1314b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        }
1315d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1316b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1317d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1318e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        int lastJpegStreamId = mJpegProcessor->getStreamId();
1319dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = updateProcessorStream(mJpegProcessor, l.mParameters);
1320b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        if (res != OK) {
1321b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1322b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1323b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            return res;
1324b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        }
13252b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        takePictureCounter = ++l.mParameters.takePictureCounter;
1326e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He
1327e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        // Clear ZSL buffer queue when Jpeg size is changed.
1328e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        bool jpegStreamChanged = mJpegProcessor->getStreamId() != lastJpegStreamId;
1329e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        if (l.mParameters.zslMode && jpegStreamChanged) {
1330e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            ALOGV("%s: Camera %d: Clear ZSL buffer queue when Jpeg size is changed",
1331e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                    __FUNCTION__, mCameraId);
1332e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            mZslProcessor->clearZslQueue();
1333e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        }
1334228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
13358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13362b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    ATRACE_ASYNC_BEGIN(kTakepictureLabel, takePictureCounter);
13372b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
13384865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    // Need HAL to have correct settings before (possibly) triggering precapture
13394865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
13404865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
1341aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin    res = mCaptureSequencer->startCapture(msgType);
1342d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1344d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1345d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1346d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1347da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return res;
134861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
134961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
135061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1351a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
13528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
135344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
13546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
13553a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
13563a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
13572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
13602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
13619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
13622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
13638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
136561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1366f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
136761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1368a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
13698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
137044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
1371ebe865b175b3f1b2a9212cea7b008937c919d8f3Igor Murashkin    // The camera service can unconditionally get the parameters at all times
1372ebe865b175b3f1b2a9212cea7b008937c919d8f3Igor Murashkin    if (getCallingPid() != mServicePid && checkPid(__FUNCTION__) != OK) return String8();
1373ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
13742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1375ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
13768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    return l.mParameters.get();
137761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
137861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
137961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1380a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
138144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
13823a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
13833a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1384c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1385c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1386c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1387c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
138836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
138936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
139036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
139136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
139236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
139336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
139436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
139536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
139636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
139736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
139836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
139936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
140036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1401228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
14022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
14032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1404228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
140536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
140636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
140736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
140836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
140936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
141036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
141136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
141236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
141336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1414c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
141536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
141636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
141736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
141836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
141936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
142036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
142136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
142236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
142336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
142436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
142536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
142636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
142736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
142836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
14292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
143036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
143136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
143236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
143336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
143436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
143536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
143873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            getPreviewStreamId() != NO_STREAM) {
143973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mDevice->setStreamTransform(getPreviewStreamId(), transform);
144036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
144236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
144336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
144436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
144536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
144736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1449c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
145036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1451983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
145236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
145336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
145436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
145536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
145636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
145736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
145836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
145936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
146036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
146136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
146236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1463983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
146436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1465983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
14662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
146736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
146836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1469983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
147036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
147136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
147236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
147336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
147436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1475ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinstatus_t Camera2Client::commandStartFaceDetectionL(int /*type*/) {
14768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
14778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
14788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
14792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
14802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
14812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
14822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
14832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
14842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
14858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
14868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
14878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
14882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
14892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
14902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
14918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
14928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
14938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
14948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
14952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
1496d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
14978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
14988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
1499caf3a9c1447f602c658f558025b90413d1b4114dZiv Hendel        return BAD_VALUE;
15008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
15012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
15028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
15048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
15068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
150836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
150936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1510228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
15118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
15128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
15138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
15148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1515228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
15168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1517228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
15188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
15202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1522228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
15238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
15248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
152636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
152736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
152836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
15292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
15302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1531174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
153236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
153336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
153436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
153536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
153636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
15382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1539983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
154036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
154136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
154236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
154336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
154436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
154536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
15468da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
154736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
154836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
154936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1550c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1551c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
155273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->setRecordingBufferCount(count);
155361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
155461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
15553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
1556160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1557160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1558160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1559174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1560174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1561174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1562174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1563174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1564174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
15662b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Trace end of AF state
15672b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        char tmp[32];
15682b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (l.mParameters.afStateCounter > 0) {
15692b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            camera_metadata_enum_snprint(
15702b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala                ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp));
15712b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_END(tmp, l.mParameters.afStateCounter);
15722b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
15732b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
15742b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Update state
1575d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        l.mParameters.focusState = newState;
15762b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        l.mParameters.afStateCounter++;
15772b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
15782b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Trace start of AF state
15792b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
15802b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        camera_metadata_enum_snprint(
15812b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp));
15822b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        ATRACE_ASYNC_BEGIN(tmp, l.mParameters.afStateCounter);
15832b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
15842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1585174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1586174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1587174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1588174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1589174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
15902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1591174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1592174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1593174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1594174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1595174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1596174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1598174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1599174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1600174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1601174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1602174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1603174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1604174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
16054ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
1606174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1607174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1608174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1609174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1610174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1611174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1612174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1613174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1614174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1615174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1616174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1617174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1618174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1619174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1620174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1621174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1622174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1623174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1624174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1626174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1627174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
16282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1630174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1631174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1633174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1634174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1635174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1636174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1637174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
16382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
16392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1640174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1641174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1642174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1643174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1644174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1645174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1646174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1647174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
16484ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
1649174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
16502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1651174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1652174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1653174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1654174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
16552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1656174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1657174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1658174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1659174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1660174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1661174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1662a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1663a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1664a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1665a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1666174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1667174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1668174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1669174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
167044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
167144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        if (l.mRemoteCallback != 0) {
167244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
16738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
16748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1675174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1676603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
16772b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        ATRACE_ASYNC_END(kAutofocusLabel, triggerId);
167844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
167944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        if (l.mRemoteCallback != 0) {
168044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1681a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
16828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1683603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1684160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1685160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1686160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1687160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1688160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1689da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1690160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1691160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1692a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1693a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1694c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1695c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1696da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const {
169773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getPreviewStreamId();
1698da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1699da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1700da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const {
1701da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mJpegProcessor->getStreamId();
1702da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1703da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1704da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const {
1705da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mCallbackProcessor->getStreamId();
1706da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1707da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1708da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const {
170973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getRecordingStreamId();
1710da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1711da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1712da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getZslStreamId() const {
1713da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mZslProcessor->getStreamId();
1714da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1715da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
17164865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
171725a0aef19e170d2695f64b4c48296e7914155a88Zhijun He        wp<camera2::FrameProcessor::FilteredListener> listener, bool sendPartials) {
171825a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    return mFrameProcessor->registerListener(minId, maxId, listener, sendPartials);
17194865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
17204865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
17214865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1722da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
17234865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mFrameProcessor->removeListener(minId, maxId, listener);
1724da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1725da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
17264865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::stopStream() {
17274865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mStreamingProcessor->stopStream();
1728da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1729da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
17304865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart;
17314865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd;
17324865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart;
17334865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd;
17344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart;
17354865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd;
1736da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
17373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
17383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
17395a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters &params) {
17408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
17418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
174222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
174322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
17444865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mStreamingProcessor->incrementStreamingIds();
17454865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res != OK) {
17464865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
17474865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
17484865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        return res;
17494865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
17504865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
175173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewRequest(params);
17528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
17538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
17548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
17558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
17568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
175773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updateRecordingRequest(params);
17588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
17598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
17608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
17618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
17628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
17638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
17642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
17655a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        res = startPreviewL(params, true);
17668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
17678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
17688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
17698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
17708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
17712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
17722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
177373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = startRecordingL(params, true);
17748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
17758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
17768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
17778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
17788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
17798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
17808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
17818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
17828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
17839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1784228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
1785228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
1786228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
1787228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1788228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1789228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1790228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
1791228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1792228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1793228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1794228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
1795f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1796228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
1797228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
1798228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1799228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
1800228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1801228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
1802228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
1803228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1804228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1805228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
1806228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
1807228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
1808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
1809228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1810228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
18118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
18124865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::syncWithDevice() {
18134865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    ATRACE_CALL();
181443b7ac6bd1a949ecb8ffc7e50d0a2f01a6258034Eino-Ville Talvala    const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms
18154865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
18164865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
18174865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
18184865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (activeRequestId == 0) return OK;
18194865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
18204865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
18214865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res == TIMED_OUT) {
18224865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
18234865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
18244865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    } else if (res != OK) {
18254865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
18264865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
18274865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
18284865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return res;
18294865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
18304865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
1831dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkintemplate <typename ProcessorT>
1832dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
1833dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                                              camera2::Parameters params) {
183482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    // No default template arguments until C++11, so we need this overload
183582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>(
183682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            processor, params);
183782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin}
183882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin
183982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkintemplate <typename ProcessorT,
184082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin          status_t (ProcessorT::*updateStreamF)(const Parameters &)>
184182db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
184282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin                                              Parameters params) {
1843dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    status_t res;
1844dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
184582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    // Get raw pointer since sp<T> doesn't have operator->*
184682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    ProcessorT *processorPtr = processor.get();
184782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    res = (processorPtr->*updateStreamF)(params);
1848dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
1849dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    /**
1850dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * Can't update the stream if it's busy?
1851dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     *
1852dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * Then we need to stop the device (by temporarily clearing the request
1853dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * queue) and then try again. Resume streaming once we're done.
1854dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     */
1855dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    if (res == -EBUSY) {
1856a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        ALOGV("%s: Camera %d: Pausing to update stream", __FUNCTION__,
1857a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                mCameraId);
1858dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mStreamingProcessor->togglePauseStream(/*pause*/true);
1859dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
1860dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
1861dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
1862dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
1863dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
1864dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mDevice->waitUntilDrained();
1865dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
1866dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
1867dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
1868dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
1869dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
187082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin        res = (processorPtr->*updateStreamF)(params);
1871dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
1872dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Failed to update processing stream "
1873dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                  " despite having halted streaming first: %s (%d)",
1874dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                  __FUNCTION__, mCameraId, strerror(-res), res);
1875dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
1876dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
1877dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mStreamingProcessor->togglePauseStream(/*pause*/false);
1878dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
1879dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)",
1880dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
1881dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
1882dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    }
1883dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
1884dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    return res;
1885dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin}
188644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
18872b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvalaconst char* Camera2Client::kAutofocusLabel = "autofocus";
18882b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvalaconst char* Camera2Client::kTakepictureLabel = "take_picture";
18892b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
189061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
1891