Camera2Client.cpp revision c1b7cc4d3eeb55fd03ff77b099b827e7568480e4
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
21f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Log.h>
22a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#include <utils/Trace.h>
2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <cutils/properties.h>
2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h>
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/Camera2Client.h"
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/StreamingProcessor.h"
307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/JpegProcessor.h"
317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CaptureSequencer.h"
327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CallbackProcessor.h"
337b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessor.h"
347b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessor3.h"
35ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalausing namespace camera2;
412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
50ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        const String16& clientPackageName,
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
53ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin        int clientPid,
54ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        uid_t clientUid,
55b99c5b8eebb35133a08c46b015624bd4c4a6c477Eino-Ville Talvala        int servicePid,
56b99c5b8eebb35133a08c46b015624bd4c4a6c477Eino-Ville Talvala        int deviceVersion):
5744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        Camera2ClientBase(cameraService, cameraClient, clientPackageName,
58ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                cameraId, cameraFacing, clientPid, clientUid, servicePid),
59ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        mParameters(cameraId, cameraFacing),
60ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        mDeviceVersion(deviceVersion)
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
62a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
63228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
70a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
71c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
74e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin    res = Camera2ClientBase::initialize(module);
75ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    if (res != OK) {
76ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        return res;
77ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    }
78ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
79fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    {
80fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
81fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
82fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        res = l.mParameters.initialize(&(mDevice->info()));
83fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (res != OK) {
84fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
85fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
86fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            return NO_INIT;
87fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        }
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    String8 threadName;
91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
9273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor = new StreamingProcessor(this);
93254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    threadName = String8::format("C2-%d-StreamProc",
94254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala            mCameraId);
95254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->run(threadName.string());
9673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
97ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    mFrameProcessor = new FrameProcessor(mDevice, this);
984bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-FrameProc",
99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mFrameProcessor->run(threadName.string());
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer = new CaptureSequencer(this);
1034bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CaptureSeq",
104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->run(threadName.string());
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
1084bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-JpegProc",
109ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala            mCameraId);
110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->run(threadName.string());
111ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
112ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    switch (mDeviceVersion) {
113ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        case CAMERA_DEVICE_API_VERSION_2_0: {
114ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            sp<ZslProcessor> zslProc =
115ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin                    new ZslProcessor(this, mCaptureSequencer);
116ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessor = zslProc;
117ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessorThread = zslProc;
118ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            break;
119ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        }
120ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        case CAMERA_DEVICE_API_VERSION_3_0:{
121ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            sp<ZslProcessor3> zslProc =
122ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin                    new ZslProcessor3(this, mCaptureSequencer);
123ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessor = zslProc;
124ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            mZslProcessorThread = zslProc;
125ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            break;
126ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        }
127ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        default:
128ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            break;
129ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    }
1304bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-ZslProc",
131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
132ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    mZslProcessorThread->run(threadName.string());
133ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
134d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor = new CallbackProcessor(this);
1354bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CallbkProc",
136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCallbackProcessor->run(threadName.string());
138d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala
139f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
140fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
141f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
142f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
1432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGD("%s", l.mParameters.paramsFlattened.string());
144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
14761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
150a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
151d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala    ALOGV("~Camera2Client");
1524ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
154f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
155c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    disconnect();
156c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Closed", mCameraId);
15861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
15961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
16061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
161611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
162d0158c38ad82c1c3033a6dd5806435def3727784Eino-Ville Talvala    result.appendFormat("Client2[%d] (%p) Client: %s PID: %d, dump:\n",
163611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
16444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            getRemoteCallback()->asBinder().get(),
165d0158c38ad82c1c3033a6dd5806435def3727784Eino-Ville Talvala            String8(mClientPackageName).string(),
166611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
171836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1744ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
176836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
178836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
180836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
18111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
184836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
186836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
189836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
191836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
192836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
194836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
195836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
197836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
203836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
204d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO)
205d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT)
206d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT)
207d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT)
208d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT)
209d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)
210d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT)
211d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE)
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
216836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
217d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF)
218d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO)
219d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE)
220d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE)
221d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA)
222d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE)
223d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD)
224d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD)
225d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA)
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
230836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
231d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO)
232d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF)
233d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ)
234d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ)
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
239836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
240c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk        case ANDROID_CONTROL_SCENE_MODE_DISABLED:
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
261836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
272836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
284d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    result.append("   Focus state: ");
285d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    switch (p.focusState) {
286d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE)
287d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
288d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
2894ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED)
290d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN)
291d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED)
292d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
293d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        default: result.append("UNKNOWN\n");
294d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    }
295d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala
2967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
297836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
299836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
300836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
301836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
302836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
303836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
3047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
3087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
310836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
311836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
3127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
314836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
3157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
316836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
317836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
318836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
319836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
320836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
3217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
323836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
324836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
325836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
3267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
328836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
3297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
331836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
3327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3330181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    result.appendFormat("    Selected still capture FPS range: %d - %d\n",
3340181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            p.fastInfo.bestStillCaptureFpsRange[0],
3350181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            p.fastInfo.bestStillCaptureFpsRange[1]);
3360181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
3373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
338da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n",
339da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId());
340ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n",
341da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getCaptureStreamId());
342da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n",
343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId());
344e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
345e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    result.append("  Quirks for this camera:\n");
346e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    bool haveQuirk = false;
347e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.triggerAfWithAuto) {
348e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    triggerAfWithAuto\n");
349e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
350e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
351e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.useZslFormat) {
352e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    useZslFormat\n");
353e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
354e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
3557373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (p.quirks.meteringCropRegion) {
3567373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        result.appendFormat("    meteringCropRegion\n");
3577373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        haveQuirk = true;
3587373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
359fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (p.quirks.partialResults) {
360fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        result.appendFormat("    usePartialResult\n");
361fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        haveQuirk = true;
362fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
363e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (!haveQuirk) {
364e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    none\n");
365e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
366e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
36773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    write(fd, result.string(), result.size());
3683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
36973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->dump(fd, args);
370428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
371da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->dump(fd, args);
372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
373c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
374c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
37597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala    mZslProcessor->dump(fd, args);
37697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala
37744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    return dumpDevice(fd, args);
3787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
37961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
38061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
38261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
384a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
38544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
386c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala
387c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    // Allow both client and the media server to disconnect at all times
388c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    int callingPid = getCallingPid();
389c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    if (callingPid != mClientPid && callingPid != mServicePid) return;
390ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
39398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Shutting down", mCameraId);
39498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
395d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala    /**
396d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * disconnect() cannot call any methods that might need to promote a
397d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * wp<Camera2Client>, since disconnect can be called from the destructor, at
398d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * which point all such promotions will fail.
399d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     */
400d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala
401d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    stopPreviewL();
4026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
40398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    {
40498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
405c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala        if (l.mParameters.state == Parameters::DISCONNECTED) return;
40698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        l.mParameters.state = Parameters::DISCONNECTED;
40798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    }
40898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
40973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->deletePreviewStream();
41073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->deleteRecordingStream();
411da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->deleteStream();
412d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor->deleteStream();
413cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala    mZslProcessor->deleteStream();
414cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala
415254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->requestExit();
41698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mFrameProcessor->requestExit();
41798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCaptureSequencer->requestExit();
41898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mJpegProcessor->requestExit();
419ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    mZslProcessorThread->requestExit();
42098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCallbackProcessor->requestExit();
42198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
42298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Waiting for threads", mCameraId);
42398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
424254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->join();
42598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mFrameProcessor->join();
42698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCaptureSequencer->join();
42798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mJpegProcessor->join();
428ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    mZslProcessorThread->join();
42998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCallbackProcessor->join();
43098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
43198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Disconnecting device", mCameraId);
43298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
43398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mDevice->disconnect();
43498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
4353a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
4368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
43761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
43861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
43961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
44061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
441a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4429e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
44344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
444ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
4469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
4479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
4489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
4509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
4538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
45444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    mRemoteCallback = client;
45544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    mSharedCameraCallbacks = client;
4569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
45861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
45961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
46061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
461a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4629e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
46344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
466ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
47961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
48061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
48161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
482a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4839e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
48444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
4859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
487ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
489907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        SharedParameters::Lock l(mParameters);
490907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        if (l.mParameters.state == Parameters::RECORD ||
491907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
492907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala            ALOGD("Not allowed to unlock camera during recording.");
493907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala            return INVALID_OPERATION;
494907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        }
4959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
49644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        mRemoteCallback.clear();
49744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        mSharedCameraCallbacks.clear();
4989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
5019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
50461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
50561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5061ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvalastatus_t Camera2Client::setPreviewTarget(
5078ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
508a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5099e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
51044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
5113a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5123a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
513ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
5146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
5168ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    if (bufferProducer != 0) {
5178ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        binder = bufferProducer->asBinder();
5181ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // Using controlledByApp flag to ensure that the buffer queue remains in
5191ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // async mode for the old camera API, where many applications depend
5201ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // on that behavior.
5211ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        window = new Surface(bufferProducer, /*controlledByApp*/ true);
5226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
52336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
5256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
52636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
527be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
528a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
5329e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
5339e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
5346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
5356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
537f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    Parameters::State state;
538f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    {
539f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        SharedParameters::Lock l(mParameters);
540f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        state = l.mParameters.state;
541f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    }
542f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    switch (state) {
5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
549f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                    Parameters::getStateName(state));
5509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
557d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            res = stopStream();
558d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            if (res != OK) {
559d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                ALOGE("%s: Unable to stop preview to swap windows: %s (%d)",
560d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                        __FUNCTION__, strerror(-res), res);
561d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                return res;
562d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            }
563f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala            state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
567bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
56873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->setPreviewWindow(window);
56973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (res != OK) {
57073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Unable to set new preview window: %s (%d)",
57173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
57273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        return res;
57373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
574bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
575f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
576f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        SharedParameters::Lock l(mParameters);
577f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        l.mParameters.state = state;
5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
58261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
58361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
58461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
585a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
58744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
588ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin
589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
597a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
598a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    switch(params.state) {
599a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::STOPPED:
600a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
601a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::PREVIEW:
602a2520db02bead68d4980783c41500ae96511bdf8Zhijun He        case Parameters::STILL_CAPTURE:
603a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            // OK
604a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            break;
605a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        default:
606a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (flag & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
607a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't use preview callbacks "
608a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "in state %d", __FUNCTION__, mCameraId, params.state);
609a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return;
610a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
611a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    }
612a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
613228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
6183ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
619527748abf04c0060894fd7aace54959a2c343435Zhijun He        if (params.previewCallbackSurface && flag != CAMERA_FRAME_CALLBACK_FLAG_NOOP) {
6203ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // Disable any existing preview callback window when enabling
6213ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // preview callback flags
6223ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = mCallbackProcessor->setCallbackWindow(NULL);
6233ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            if (res != OK) {
6243ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to clear preview callback surface:"
6253ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                        " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
6263ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                return;
6273ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            }
6283ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            params.previewCallbackSurface = false;
6293ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        }
6303ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
631228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
6323ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
633a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (params.state == Parameters::PREVIEW) {
634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
635a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
636a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to refresh request in state %s",
637a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        __FUNCTION__, mCameraId,
638a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        Parameters::getStateName(params.state));
639a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
6403ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        }
6413ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6423ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala}
6433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6443ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvalastatus_t Camera2Client::setPreviewCallbackTarget(
6453ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        const sp<IGraphicBufferProducer>& callbackProducer) {
6463ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    ATRACE_CALL();
6473ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
6483ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    Mutex::Autolock icl(mBinderSerializationLock);
6493ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    status_t res;
6503ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6513ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6523ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    sp<ANativeWindow> window;
6533ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (callbackProducer != 0) {
6543ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        window = new Surface(callbackProducer);
6553ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6563ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6573ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    res = mCallbackProcessor->setCallbackWindow(window);
6583ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (res != OK) {
6593ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview callback surface: %s (%d)",
6603ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6613ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        return res;
6623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6643ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6663ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (window != NULL) {
6673ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        // Disable traditional callbacks when a valid callback target is given
6683ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackFlags = CAMERA_FRAME_CALLBACK_FLAG_NOOP;
6693ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackOneShot = false;
6703ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackSurface = true;
6713ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    } else {
6723ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        // Disable callback target if given a NULL interface.
6733ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackSurface = false;
6743ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6753ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6763ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    switch(l.mParameters.state) {
6772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
6783ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = startPreviewL(l.mParameters, true);
679228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
6823ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = startRecordingL(l.mParameters, true);
683228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
684228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
685228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
6863ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6873ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (res != OK) {
6883ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to refresh request in state %s",
6893ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                __FUNCTION__, mCameraId,
6903ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                Parameters::getStateName(l.mParameters.state));
691228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
692228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
6933ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    return OK;
69461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
69561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
6963ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
69761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
698a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6999e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
70044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
7013a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7023a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
705d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
706ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
707228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
708d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
7096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
71022d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
71122d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
71222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
713a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala    if ( (params.state == Parameters::PREVIEW ||
714a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                    params.state == Parameters::RECORD ||
715a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                    params.state == Parameters::VIDEO_SNAPSHOT)
716a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala            && !restart) {
717a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        // Succeed attempt to re-enter a streaming state
718a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        ALOGI("%s: Camera %d: Preview already active, ignoring restart",
719a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                __FUNCTION__, mCameraId);
72077449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray        return OK;
72177449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    }
72277449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    if (params.state > Parameters::PREVIEW && !restart) {
7234ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
7252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
7264ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
7274ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
7286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
72973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!mStreamingProcessor->haveValidPreviewWindow()) {
7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
7316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
7326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
734c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    int lastPreviewStreamId = mStreamingProcessor->getPreviewStreamId();
7359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
73673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewStream(params);
737be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
738be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
739be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
7416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
74273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
743c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    bool previewStreamChanged = mStreamingProcessor->getPreviewStreamId() != lastPreviewStreamId;
744c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He
745a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // We could wait to create the JPEG output stream until first actual use
746a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // (first takePicture call). However, this would substantially increase the
747a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // first capture latency on HAL3 devices, and potentially on some HAL2
748a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // devices. So create it unconditionally at preview start. As a drawback,
749a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // this increases gralloc memory consumption for applications that don't
750a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // ever take a picture.
751a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // TODO: Find a better compromise, though this likely would involve HAL
752a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // changes.
753a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    res = updateProcessorStream(mJpegProcessor, params);
754a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    if (res != OK) {
755a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala        ALOGE("%s: Camera %d: Can't pre-configure still image "
756a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                "stream: %s (%d)",
757a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
758a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala        return res;
759a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    }
760a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala
761d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    Vector<int32_t> outputStreams;
7623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    bool callbacksEnabled = (params.previewCallbackFlags &
7633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ||
7643ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            params.previewCallbackSurface;
7653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
766228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
767a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        // Can't have recording stream hanging around when enabling callbacks,
768a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        // since it exceeds the max stream count on some devices.
769a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (mStreamingProcessor->getRecordingStreamId() != NO_STREAM) {
770a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGV("%s: Camera %d: Clearing out recording stream before "
771a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    "creating callback stream", __FUNCTION__, mCameraId);
772a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            res = mStreamingProcessor->stopStream();
773a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
774a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming to delete "
775a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "recording stream", __FUNCTION__, mCameraId);
776a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return res;
777a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
778a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            res = mStreamingProcessor->deleteRecordingStream();
779a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
780a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete recording stream before "
781a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "enabling callbacks: %s (%d)", __FUNCTION__, mCameraId,
782a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        strerror(-res), res);
783a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return res;
784a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
785a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
786a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
787d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
788228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
789228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
790228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
791228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
792228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
79373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getCallbackStreamId());
794c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    } else if (previewStreamChanged && mCallbackProcessor->getStreamId() != NO_STREAM) {
795c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        /**
796c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * Delete the unused callback stream when preview stream is changed and
797c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * preview is not enabled. Don't need stop preview stream as preview is in
798c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * STOPPED state now.
799c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         */
800c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        ALOGV("%s: Camera %d: Delete unused preview callback stream.",  __FUNCTION__, mCameraId);
801c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        res = mCallbackProcessor->deleteStream();
802c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        if (res != OK) {
803c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            ALOGE("%s: Camera %d: Unable to delete callback stream %s (%d)",
804c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He                    __FUNCTION__, mCameraId, strerror(-res), res);
805c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            return res;
806c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        }
807228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8085a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    if (params.zslMode && !params.recordingHint) {
809dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = updateProcessorStream(mZslProcessor, params);
810da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
811da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
812da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
813da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
814da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
81573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getZslStreamId());
816da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
8176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
81873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
81973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
8205a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    if (!params.recordingHint) {
82173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
82273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updatePreviewRequest(params);
8235a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            if (res != OK) {
82473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request: "
82573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId,
82673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
8275a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                return res;
8285a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            }
8295a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        }
83073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
83173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
8325a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    } else {
83373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
83473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updateRecordingRequest(params);
83573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            if (res != OK) {
83673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request with "
83773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "record hint: %s (%d)", __FUNCTION__, mCameraId,
83873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
83973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                return res;
84073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            }
84173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
84273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
84373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
844be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
845be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
84673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
847be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
8496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
8526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
85361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
85461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
85561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
856a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8579e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
85844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
8593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8603a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
86136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
862ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
863ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
86436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
865ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
8664865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
867d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds
8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
869228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
872228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
873228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
874228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
8752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
876ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            // Nothing to do.
877d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
8782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
879d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
8802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
881d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout);
882d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            // no break
8832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
885a27c4aa222c8dd1712617dad954c5f3aa68d5427Ruben Brunk            syncWithDevice();
886d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            res = stopStream();
887d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            if (res != OK) {
888d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)",
889d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
890d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            }
8914865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            res = mDevice->waitUntilDrained();
8924865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            if (res != OK) {
8934865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
8944865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
8954865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            }
896228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
8972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
8992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
9002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
901d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
902228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
903d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
904d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
905228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
906d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
90761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
90861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
90961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
910a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
91144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9123a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
9143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
91761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
91861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
91961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
920a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
92144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9223a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9233a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9243a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
9272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
92978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
9302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
93278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
93378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
93478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
93578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
93678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
93778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
9382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
93978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
94078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
94161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
94261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
94361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
944a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9459e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
94644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
9483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
950228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
952228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
9533a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
954228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
955228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
95622d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
95722d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
95822d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
959228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
961228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
9629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
9639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
9659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
9669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
969228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
970228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
971228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
9729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
9749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
9752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
9779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
9789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
9799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
980228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
98178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
98278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
98378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
98478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
98578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
98678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
98773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!restart) {
98873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mCameraService->playSound(CameraService::SOUND_RECORDING);
98973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mStreamingProcessor->updateRecordingRequest(params);
99073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (res != OK) {
99173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
99273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
99373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            return res;
99473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
99573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
996609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
997a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // Not all devices can support a preview callback stream and a recording
998a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // stream at the same time, so assume none of them can.
999a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    if (mCallbackProcessor->getStreamId() != NO_STREAM) {
1000a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        ALOGV("%s: Camera %d: Clearing out callback stream before "
1001a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                "creating recording stream", __FUNCTION__, mCameraId);
1002a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        res = mStreamingProcessor->stopStream();
1003a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (res != OK) {
1004a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream",
1005a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1006a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            return res;
1007a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
1008a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        res = mCallbackProcessor->deleteStream();
1009a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (res != OK) {
1010a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to delete callback stream before "
1011a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    "record: %s (%d)", __FUNCTION__, mCameraId,
1012a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    strerror(-res), res);
1013a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            return res;
1014a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
1015a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    }
1016a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // Disable callbacks if they're enabled; can't record and use callbacks,
1017a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // and we can't fail record start without stagefright asserting.
1018a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    params.previewCallbackFlags = 0;
1019a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
102082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    res = updateProcessorStream<
102182db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            StreamingProcessor,
102282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            &StreamingProcessor::updateRecordingStream>(mStreamingProcessor,
102382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin                                                        params);
10249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
10259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
10269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
10279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
10289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
102973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
1030d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    Vector<int32_t> outputStreams;
103173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
103273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getRecordingStreamId());
10339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
103473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
103573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            outputStreams);
10369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
103773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
10389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
10399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
10409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
10419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
10422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
10432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
1044228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
10459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
10469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
104761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
104861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
104961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
1050a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
10519e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
105244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
10532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
1054228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
10559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
10563a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
10573a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
10582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
10592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
10609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
10619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
10622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
10632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
10652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
10669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
10679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
10682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
10692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
10709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
10719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
10729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1073609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
1074609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
10755a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    res = startPreviewL(l.mParameters, true);
10769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
10775a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to return to preview",
10785a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                __FUNCTION__, mCameraId);
10799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
108061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
108161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
108261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
1083a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
108444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
10858da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
10863a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
10873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
10888da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
10898da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
10908da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
10918da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
10928da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
10932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
10948da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
10952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
10962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
109761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
109861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
109961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
1100a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
110144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11023a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
110330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
110473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->releaseRecordingFrame(mem);
110561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
110661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
110761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
1108a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
110944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
11113a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
11123a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1114174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1115d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    bool notifyImmediately = false;
1116d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    bool notifySuccess = false;
1117174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
11182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
11194865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        if (l.mParameters.state < Parameters::PREVIEW) {
11204865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            return INVALID_OPERATION;
11214865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        }
11224865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
11235f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        /**
11245f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * If the camera does not support auto-focus, it is a no-op and
11255f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * onAutoFocus(boolean, Camera) callback will be called immediately
11265f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * with a fake value of success set to true.
11279454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          *
11289454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          * Similarly, if focus mode is set to INFINITY, there's no reason to
11299454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          * bother the HAL.
11305f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          */
11319454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
11329454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
1133d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifyImmediately = true;
1134d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifySuccess = true;
1135d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        }
1136d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1137d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * If we're in CAF mode, and AF has already been locked, just fire back
1138d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * the callback right away; the HAL would not send a notification since
1139d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * no state change would happen on a AF trigger.
1140d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
1141d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE ||
1142d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) &&
1143d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) {
1144d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifyImmediately = true;
1145d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifySuccess = true;
1146d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        }
1147d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1148d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * Send immediate notification back to client
1149d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
1150d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        if (notifyImmediately) {
115144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
115244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            if (l.mRemoteCallback != 0) {
115344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1154d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                        notifySuccess ? 1 : 0, 0);
11555f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            }
11565f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            return OK;
11575f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        }
1158d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1159d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * Handle quirk mode for AF in scene modes
1160d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
116195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        if (l.mParameters.quirks.triggerAfWithAuto &&
1162c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk                l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED &&
1163ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala                l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO &&
1164ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala                !l.mParameters.focusingAreas[0].isEmpty()) {
116595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
116695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                    __FUNCTION__, l.mParameters.focusMode);
116795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.shadowFocusMode = l.mParameters.focusMode;
116895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
116995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            updateRequests(l.mParameters);
117095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        }
117195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala
11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
1174174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
11752b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    ATRACE_ASYNC_BEGIN(kAutofocusLabel, triggerId);
11762b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
11774865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
1178174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1179174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
1180174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
11816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
118261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
118361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
118461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
1185a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
118644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
11883a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
11893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1191174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1192174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
11932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
11949454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        // Canceling does nothing in FIXED or INFINITY modes
11959454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
11969454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
11979454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala            return OK;
11989454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        }
11992b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
12002b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // An active AF trigger is canceled
12012b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (l.mParameters.afTriggerCounter == l.mParameters.currentAfTriggerId) {
12022b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_END(kAutofocusLabel, l.mParameters.currentAfTriggerId);
12032b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
12042b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
12052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
120695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala
120795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        // When using triggerAfWithAuto quirk, may need to reset focus mode to
1208ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala        // the real state at this point. No need to cancel explicitly if
1209ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala        // changing the AF mode.
121095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
121195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
121295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                    l.mParameters.shadowFocusMode);
121395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.focusMode = l.mParameters.shadowFocusMode;
121495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
121595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            updateRequests(l.mParameters);
1216ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala
1217ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala            return OK;
121895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        }
1219174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
12204865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
1221174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1222174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1223174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
12246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
122561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
122661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1227ff82370c7c04340d50673d425f48acafd00f2bc9Ben Murdochstatus_t Camera2Client::takePicture(int msgType) {
1228a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
122944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
1230d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
12313a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1232d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
12332b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    int takePictureCounter;
1234b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala    {
1235b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        SharedParameters::Lock l(mParameters);
1236b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        switch (l.mParameters.state) {
1237b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::DISCONNECTED:
1238b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::STOPPED:
1239b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1240b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1241da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        __FUNCTION__, mCameraId);
1242b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                return INVALID_OPERATION;
1243b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::PREVIEW:
1244b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                // Good to go for takePicture
1245b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                res = commandStopFaceDetectionL(l.mParameters);
1246b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                if (res != OK) {
1247b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1248b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                            __FUNCTION__, mCameraId);
1249b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    return res;
1250b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                }
1251b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                l.mParameters.state = Parameters::STILL_CAPTURE;
1252b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                break;
1253b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::RECORD:
1254b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                // Good to go for video snapshot
1255b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1256b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                break;
1257b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::STILL_CAPTURE:
1258b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
1259b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                ALOGE("%s: Camera %d: Already taking a picture",
1260b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                        __FUNCTION__, mCameraId);
1261b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                return INVALID_OPERATION;
1262b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        }
1263d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1264b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1265d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1266dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = updateProcessorStream(mJpegProcessor, l.mParameters);
1267b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        if (res != OK) {
1268b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1269b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1270b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            return res;
1271b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        }
12722b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        takePictureCounter = ++l.mParameters.takePictureCounter;
1273228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
12748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12752b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    ATRACE_ASYNC_BEGIN(kTakepictureLabel, takePictureCounter);
12762b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
12774865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    // Need HAL to have correct settings before (possibly) triggering precapture
12784865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
12794865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
1280aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin    res = mCaptureSequencer->startCapture(msgType);
1281d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1283d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1284d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1285d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return res;
128761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
128861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
128961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1290a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
12918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
129244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
12936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
12943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
12953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
13009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
13028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
130461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1305f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
130661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1307a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
13088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
130944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
13103a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1311ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1313ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
13148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    return l.mParameters.get();
131561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
131661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
131761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1318a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
131944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
13203a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
13213a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1322c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1323c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1324c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1325c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
132636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
132736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
132836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
132936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
133036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
133136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
133236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
133336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
133436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
133536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
133636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
133736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
133836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1339228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
13402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
13412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1342228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
134336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
134436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
134536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
134636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
134736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
134836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
134936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
135036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
135136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1352c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
135336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
135436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
135536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
135636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
135736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
135836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
135936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
136036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
136136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
136236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
136336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
136436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
136536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
136636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
13672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
136836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
136936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
137036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
137136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
137236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
137336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
13742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
137673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            getPreviewStreamId() != NO_STREAM) {
137773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mDevice->setStreamTransform(getPreviewStreamId(), transform);
137836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
13792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
138036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
138136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
138236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
138336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
13842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
138536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1387c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
138836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1389983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
139036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
139136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
139236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
139336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
139436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
139536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
139636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
139736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
139836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
139936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
140036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1401983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
140236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1403983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
14042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
140536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
140636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1407983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
140836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
140936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
141036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
141136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
141236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1413ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinstatus_t Camera2Client::commandStartFaceDetectionL(int /*type*/) {
14148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
14158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
14168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
14172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
14182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
14192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
14202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
14212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
14222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
14238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
14248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
14258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
14262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
14272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
14282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
14298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
14308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
14318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
14328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
14332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
1434d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
14358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
14368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
1437caf3a9c1447f602c658f558025b90413d1b4114dZiv Hendel        return BAD_VALUE;
14388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
14408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
14428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
14448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
14458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
144636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
144736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1448228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
14498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
14508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
14518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
14528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1453228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
14548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1455228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
14568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
14572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
14582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
14592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1460228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
14618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
14628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
14638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
146436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
146536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
146636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
14672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
14682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1469174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
147036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
147136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
147236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
147336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
147436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
14752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
14762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1477983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
147836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
147936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
148036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
148136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
148236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
148336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
14848da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
148536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
148636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
148736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1488c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1489c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
149073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->setRecordingBufferCount(count);
149161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
149261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
1494160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1495160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1496160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1497174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1498174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1499174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1500174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1501174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1502174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
15042b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Trace end of AF state
15052b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        char tmp[32];
15062b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (l.mParameters.afStateCounter > 0) {
15072b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            camera_metadata_enum_snprint(
15082b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala                ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp));
15092b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_END(tmp, l.mParameters.afStateCounter);
15102b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
15112b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
15122b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Update state
1513d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        l.mParameters.focusState = newState;
15142b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        l.mParameters.afStateCounter++;
15152b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
15162b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Trace start of AF state
15172b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
15182b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        camera_metadata_enum_snprint(
15192b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp));
15202b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        ATRACE_ASYNC_BEGIN(tmp, l.mParameters.afStateCounter);
15212b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
15222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1523174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1524174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1525174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1526174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1527174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1529174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1530174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1531174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1532174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1533174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1534174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
15352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1536174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1537174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1538174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1539174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1540174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1541174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1542174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
15434ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
1544174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1545174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1546174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1547174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1548174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1549174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1550174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1551174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1552174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1553174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1554174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1555174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1556174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1557174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1558174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1559174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1560174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1561174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1562174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1564174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1565174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1568174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1569174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1571174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1572174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1573174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1574174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1575174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1578174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1579174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1580174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1581174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1582174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1583174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1584174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1585174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
15864ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
1587174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1589174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1590174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1591174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1592174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1594174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1595174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1596174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1597174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1598174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1599174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1600a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1601a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1602a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1603a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1604174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1605174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1606174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1607174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
160844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
160944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        if (l.mRemoteCallback != 0) {
161044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
16118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
16128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1613174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1614603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
16152b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        ATRACE_ASYNC_END(kAutofocusLabel, triggerId);
161644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
161744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        if (l.mRemoteCallback != 0) {
161844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1619a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
16208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1621603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1622160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1623160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1624160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1625160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1626160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1627da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1628160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1629160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1630a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1631a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1632c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1633c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1634da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const {
163573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getPreviewStreamId();
1636da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1637da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1638da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const {
1639da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mJpegProcessor->getStreamId();
1640da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1641da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1642da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const {
1643da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mCallbackProcessor->getStreamId();
1644da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1645da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1646da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const {
164773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getRecordingStreamId();
1648da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1649da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1650da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getZslStreamId() const {
1651da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mZslProcessor->getStreamId();
1652da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1653da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
16544865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
16554865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
16564865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mFrameProcessor->registerListener(minId, maxId, listener);
16574865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
16584865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
16594865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1660da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
16614865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mFrameProcessor->removeListener(minId, maxId, listener);
1662da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1663da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
16644865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::stopStream() {
16654865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mStreamingProcessor->stopStream();
1666da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1667da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
16684865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart;
16694865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd;
16704865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart;
16714865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd;
16724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart;
16734865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd;
1674da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
16753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
16763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16775a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters &params) {
16788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
16798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
168022d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
168122d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
16824865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mStreamingProcessor->incrementStreamingIds();
16834865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res != OK) {
16844865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
16854865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
16864865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        return res;
16874865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
16884865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
168973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewRequest(params);
16908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
16918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
16928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
16938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
16948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
169573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updateRecordingRequest(params);
16968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
16978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
16988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
16998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
17008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
17018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
17022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
17035a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        res = startPreviewL(params, true);
17048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
17058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
17068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
17078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
17088ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
17092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
17102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
171173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = startRecordingL(params, true);
17128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
17138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
17148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
17158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
17168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
17178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
17188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
17198ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
17208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
17219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1722228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
1723228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
1724228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
1725228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1726228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1727228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1728228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
1729228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1730228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1731228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1732228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
1733f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1734228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
1735228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
1736228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1737228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
1738228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1739228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
1740228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
1741228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1742228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1743228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
1744228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
1745228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
1746228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
1747228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1748228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
17498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
17504865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::syncWithDevice() {
17514865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    ATRACE_CALL();
175243b7ac6bd1a949ecb8ffc7e50d0a2f01a6258034Eino-Ville Talvala    const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms
17534865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
17544865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
17554865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
17564865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (activeRequestId == 0) return OK;
17574865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
17584865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
17594865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res == TIMED_OUT) {
17604865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
17614865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
17624865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    } else if (res != OK) {
17634865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
17644865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
17654865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
17664865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return res;
17674865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
17684865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
1769dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkintemplate <typename ProcessorT>
1770dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
1771dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                                              camera2::Parameters params) {
177282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    // No default template arguments until C++11, so we need this overload
177382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>(
177482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            processor, params);
177582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin}
177682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin
177782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkintemplate <typename ProcessorT,
177882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin          status_t (ProcessorT::*updateStreamF)(const Parameters &)>
177982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
178082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin                                              Parameters params) {
1781dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    status_t res;
1782dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
178382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    // Get raw pointer since sp<T> doesn't have operator->*
178482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    ProcessorT *processorPtr = processor.get();
178582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    res = (processorPtr->*updateStreamF)(params);
1786dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
1787dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    /**
1788dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * Can't update the stream if it's busy?
1789dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     *
1790dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * Then we need to stop the device (by temporarily clearing the request
1791dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * queue) and then try again. Resume streaming once we're done.
1792dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     */
1793dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    if (res == -EBUSY) {
1794a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        ALOGV("%s: Camera %d: Pausing to update stream", __FUNCTION__,
1795a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                mCameraId);
1796dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mStreamingProcessor->togglePauseStream(/*pause*/true);
1797dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
1798dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
1799dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
1800dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
1801dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
1802dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mDevice->waitUntilDrained();
1803dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
1804dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
1805dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
1806dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
1807dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
180882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin        res = (processorPtr->*updateStreamF)(params);
1809dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
1810dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Failed to update processing stream "
1811dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                  " despite having halted streaming first: %s (%d)",
1812dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                  __FUNCTION__, mCameraId, strerror(-res), res);
1813dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
1814dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
1815dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mStreamingProcessor->togglePauseStream(/*pause*/false);
1816dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
1817dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)",
1818dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
1819dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
1820dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    }
1821dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
1822dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    return res;
1823dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin}
182444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
18252b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvalaconst char* Camera2Client::kAutofocusLabel = "autofocus";
18262b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvalaconst char* Camera2Client::kTakepictureLabel = "take_picture";
18272b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
182861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
1829