Camera2Client.cpp revision 4865c526e681366481b0ab242ffa1ead57bb02cc
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
174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2"
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/SurfaceTextureClient.h>
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h>
27e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter#include "camera2/Parameters.h"
2810894e509f777c6bd7e408a57f5cf21ee2b36a96James Painter#include "Camera2Client.h"
2961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalausing namespace camera2;
352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingUid() {
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingUid();
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
50ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin        int clientPid,
51ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin        int servicePid):
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        Client(cameraService, cameraClient,
53ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin                cameraId, cameraFacing, clientPid, servicePid),
54ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        mSharedCameraClient(cameraClient),
5573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mParameters(cameraId, cameraFacing)
56f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
57a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
58da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Opened", cameraId);
5961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
61228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const {
673a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    int callingPid = getCallingPid();
68ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    if (callingPid == mClientPid || callingPid == mServicePid) return NO_ERROR;
693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    ALOGE("%s: attempt to use a locked camera from a different process"
71ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin            " (old pid %d, new pid %d, servicePid %d)", checkLocation, mClientPid, callingPid, mServicePid);
723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    return PERMISSION_DENIED;
733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala}
743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
77a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
78c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
88174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->setNotifyCallback(this);
89174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.initialize(&(mDevice->info()));
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    String8 threadName;
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
10173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor = new StreamingProcessor(this);
10273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
103ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    mFrameProcessor = new FrameProcessor(this);
1044bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-FrameProc",
105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mFrameProcessor->run(threadName.string());
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer = new CaptureSequencer(this);
1094bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CaptureSeq",
110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->run(threadName.string());
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
1144bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-JpegProc",
115ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala            mCameraId);
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->run(threadName.string());
117ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
1194bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-ZslProc",
120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mZslProcessor->run(threadName.string());
122ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
123d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor = new CallbackProcessor(this);
1244bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CallbkProc",
125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCallbackProcessor->run(threadName.string());
127d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala
128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
1312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGD("%s", l.mParameters.paramsFlattened.string());
132f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
133f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
134f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
13561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
138a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1394ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
141f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
142ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    Parameters::State state;
143ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    // warning:
144ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    //   holding on to locks more than necessary may be hazardous to your health
145ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    {
146ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin        SharedParameters::Lock l(mParameters);
147ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin        state = l.mParameters.state;
148ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    }
149ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin
150ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    if (state != Parameters::DISCONNECTED) {
15173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        // Rewrite mClientPid to allow shutdown by CameraService
15273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mClientPid = getCallingPid();
15373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        disconnect();
15473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
155c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Closed", mCameraId);
15761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
15861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
15961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
160611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1613297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
162611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
163611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
164611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
169836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1724ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
174836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
176836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
178836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
17911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
180836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
184836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
186836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
189836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
190836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
192836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
193836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
195836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
197836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
201836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
214836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
228836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
237836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
259836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
270836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
283836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
285836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
286836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
287836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
289836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
2907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
293836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
2947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
296836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
297836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
2987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
300836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
3017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
302836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
303836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
305836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
306836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
3077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
309836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
310836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
311836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
3127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
314836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
3157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
317836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
3187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n",
321da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId());
322ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n",
323da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getCaptureStreamId());
324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n",
325da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId());
326e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
327e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    result.append("  Quirks for this camera:\n");
328e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    bool haveQuirk = false;
329e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.triggerAfWithAuto) {
330e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    triggerAfWithAuto\n");
331e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
332e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
333e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.useZslFormat) {
334e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    useZslFormat\n");
335e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
336e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
337e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (!haveQuirk) {
338e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    none\n");
339e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
340e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
34173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    write(fd, result.string(), result.size());
3423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
34373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->dump(fd, args);
344428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
345da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->dump(fd, args);
346da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
347c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
348c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
34997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala    mZslProcessor->dump(fd, args);
35097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala
3513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
352611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
3537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
3553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
3563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
3573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
3583297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3593297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
362611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
36361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
36461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
36661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
368a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
369ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
3703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
3713a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
372ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
373f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
37598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Shutting down", mCameraId);
37698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
37736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
3786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
37998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    {
38098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
38198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        l.mParameters.state = Parameters::DISCONNECTED;
38298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    }
38398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
38473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->deletePreviewStream();
38573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->deleteRecordingStream();
386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->deleteStream();
387d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor->deleteStream();
388cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala    mZslProcessor->deleteStream();
389cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala
39098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mFrameProcessor->requestExit();
39198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCaptureSequencer->requestExit();
39298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mJpegProcessor->requestExit();
39398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mZslProcessor->requestExit();
39498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCallbackProcessor->requestExit();
39598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
39698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Waiting for threads", mCameraId);
39798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
39898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mFrameProcessor->join();
39998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCaptureSequencer->join();
40098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mJpegProcessor->join();
40198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mZslProcessor->join();
40298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCallbackProcessor->join();
40398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
40498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Disconnecting device", mCameraId);
40598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
40698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mDevice->disconnect();
40798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
4083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
4098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
41061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
41161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
41261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
41361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
414a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4159e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
416ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
417ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
4199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
4209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
4219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
4229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
4239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
4268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
4279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = client;
428a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedCameraClient = client;
4299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
43161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
43261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
43361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
434a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4359e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
436ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
439ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
45261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
45361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
45461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
455a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4569e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
457ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
460ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Check for uninterruptable conditions
4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
466a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedCameraClient.clear();
4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
47361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
47461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
477a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4789e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
479ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4813a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
482ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
4866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
49036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder,window);
49161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
49261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
4946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
495a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4969e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
497ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4983a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4993a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
500ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
5016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
5026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
5036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
5046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
5056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
5066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
50736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
5086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
5096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
51036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
511be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
512a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
5169e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
5179e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
5186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
5196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
5242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
5309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
5379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Optimize this so that we don't wait for old stream to drain
5389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // before spinning up new stream
5394865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            mStreamingProcessor->stopStream();
5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
544bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
54573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->setPreviewWindow(window);
54673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (res != OK) {
54773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Unable to set new preview window: %s (%d)",
54873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
54973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        return res;
55073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
551bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
55761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
55861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
55961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
560a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
561228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
562ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
564228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
565228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
568228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
569228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
572228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
576228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
577228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        switch(params.state) {
5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
581228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
584228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startRecordingL(params, true);
585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
59661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
59761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
59861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
599a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6009e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
601ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6023a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6033a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
606d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
607ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
609d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
6106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
61122d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
61222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
61322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
61477449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    if (params.state == Parameters::PREVIEW && !restart) {
61577449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray        // Succeed attempt to re-enter preview state
61677449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray        ALOGI("%s: Not starting preview; already in preview state.",
61777449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray              __FUNCTION__);
61877449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray        return OK;
61977449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    }
62077449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    if (params.state > Parameters::PREVIEW && !restart) {
6214ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
6232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
6244ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
6254ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
6266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
62773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!mStreamingProcessor->haveValidPreviewWindow()) {
6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
6296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
6306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
6329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
63373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewStream(params);
634be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
635be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
636be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
637be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
6386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
63973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
64073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    Vector<uint8_t> outputStreams;
641228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
642228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
643228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
644d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
645228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
646228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
647228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
648228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
649228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
65073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getCallbackStreamId());
651228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
6525a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    if (params.zslMode && !params.recordingHint) {
653da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mZslProcessor->updateStream(params);
654da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
655da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
656da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
657da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
658da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
65973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getZslStreamId());
660da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
6616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
66273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
66373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
6645a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    if (!params.recordingHint) {
66573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
66673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updatePreviewRequest(params);
6675a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            if (res != OK) {
66873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request: "
66973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId,
67073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
6715a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                return res;
6725a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            }
6735a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        }
67473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
67573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
6765a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    } else {
6775a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        // With recording hint set, we're going to be operating under the
6785a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        // assumption that the user will record video. To optimize recording
6795a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        // startup time, create the necessary output streams for recording and
6805a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        // video snapshot now if they don't already exist.
6815a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        res = mJpegProcessor->updateStream(params);
6825a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        if (res != OK) {
6835a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't pre-configure still image "
6845a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                    "stream: %s (%d)",
685be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
686be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
687be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
688da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
68973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
69073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updateRecordingRequest(params);
69173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            if (res != OK) {
69273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request with "
69373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "record hint: %s (%d)", __FUNCTION__, mCameraId,
69473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
69573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                return res;
69673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            }
69773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
69873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
69973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
700be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
701be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
70273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
703be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
7056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
7086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
70961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
71061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
71161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
712a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7139e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
714ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7163a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
71736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
718ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
719ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
72036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
721ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
7224865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
724228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
7252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
727228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
728228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
729228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
731d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
732d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
733d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
735d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
737d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
738d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
739d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
741228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break - identical to preview
7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
74373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            mStreamingProcessor->stopStream();
7444865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            res = mDevice->waitUntilDrained();
7454865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            if (res != OK) {
7464865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
7474865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
7484865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            }
749228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
7522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
754d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
755228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
756d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
757d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
758228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
759d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
76061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
76161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
76261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
763a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
764ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
7673a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
77061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
77161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
77261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
773a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
774ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
78278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
78578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
78678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
78778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
78878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
78978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
79078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
79278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
79378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
79461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
79561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
79661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
797a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7989e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
799ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
8013a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
803228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
805228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
8063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
807228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
80922d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
81022d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
81122d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
812228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
8132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
814228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
8159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
8169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
8189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
8199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
822228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
823228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
824228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
8259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
8279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
8282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
8309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
8319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
8329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
833228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
83478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
83578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
83678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
83778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
83878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
83978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
84073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!restart) {
84173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mCameraService->playSound(CameraService::SOUND_RECORDING);
84273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mStreamingProcessor->updateRecordingRequest(params);
84373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (res != OK) {
84473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
84573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
84673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            return res;
84773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
84873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
849609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
85073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updateRecordingStream(params);
8519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
8539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
85673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
85773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    Vector<uint8_t> outputStreams;
858228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
859228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
860228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
861d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
862228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
863228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
864228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
865228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
866228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
86773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getCallbackStreamId());
868228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
86973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
87073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getRecordingStreamId());
8719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
87273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
87373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            outputStreams);
8749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
87573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
8769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
8812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
882228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
88561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
88661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
88761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
888a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8899e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
890ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
892228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
8943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
8953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
8962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
8972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
8999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
9012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
9022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
9032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
9049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
9059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
9062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
9089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
9099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
9109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
911609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
912609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
9135a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    res = startPreviewL(l.mParameters, true);
9149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
9155a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to return to preview",
9165a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                __FUNCTION__, mCameraId);
9179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
91861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
91961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
92061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
921a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
922ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9238da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9243a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
9253a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9268da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
9278da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
9288da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9298da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
9308da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
9312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9328da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
9342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
93561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
93661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
93761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
938a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
939ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
94130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
94273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->releaseRecordingFrame(mem);
94361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
94461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
94561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
946a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
947ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
9493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9513a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
952174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
953174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
9542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
9554865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        if (l.mParameters.state < Parameters::PREVIEW) {
9564865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            return INVALID_OPERATION;
9574865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        }
9584865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
9592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
961174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
9624865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
963174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
964174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
965174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
9666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
96761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
96861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
96961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
970a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
971ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
9733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
976174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
977174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
9782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
9792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
980174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
9814865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
982174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
983174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
984174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
9856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
98661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
98761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
98861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
989a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
990ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
991d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
9923a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
993d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
9942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
9982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
999d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1000d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1001d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
10022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
1003d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
1004da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            res = commandStopFaceDetectionL(l.mParameters);
1005da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            if (res != OK) {
1006da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1007da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        __FUNCTION__, mCameraId);
1008da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                return res;
1009da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            }
1010da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            l.mParameters.state = Parameters::STILL_CAPTURE;
1011da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
1012da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::RECORD:
1013da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            // Good to go for video snapshot
1014da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1015d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
10162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
10172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
1018d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
1019d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1020d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1021d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1022d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1024d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1025da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mJpegProcessor->updateStream(l.mParameters);
1026228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (res != OK) {
1027228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1028228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1029228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return res;
1030228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
10318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
10324865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    // Need HAL to have correct settings before (possibly) triggering precapture
10334865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
10344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
1035da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mCaptureSequencer->startCapture();
1036d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1037da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1038d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1039d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1040d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1041da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return res;
104261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
104361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
104461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1045a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
10468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1047ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
10486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
10493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
10512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
10526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
10542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
10559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
10562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
10578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
10588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
105961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1060f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
106161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1062a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
10638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1064ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
10653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1066ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
10672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1068ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
10698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    return l.mParameters.get();
107061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
107161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
107261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1073a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1074ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
10753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
10763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1077c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1078c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1079c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1080c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
108136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
108236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
108336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
108436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
108536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
108636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
108736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
108836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
108936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
109036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
109136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
109236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
109336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1094228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
10952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
10962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1097228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
109836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
109936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
110036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
110136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
110236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
110336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
110436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
110536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
110636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1107c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
110836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
110936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
111036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
111136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
111236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
111336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
111436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
111536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
111636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
111736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
111836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
111936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
112036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
112136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
11222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
112336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
112436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
112536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
112636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
112736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
112836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
11292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
113173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            getPreviewStreamId() != NO_STREAM) {
113273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mDevice->setStreamTransform(getPreviewStreamId(), transform);
113336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
11342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
113536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
113636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
113736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
113836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
11392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
114036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1142c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
114336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1144983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
114536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
114636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
114736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
114836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
114936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
115036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
115136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
115236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
115336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
115436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
115536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1156983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
115736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1158983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
11592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
116036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
116136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1162983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
116336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
116436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
116536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
116636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
116736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
116836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartFaceDetectionL(int type) {
11698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
11708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
11718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
11788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
11798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
11808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
11812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
11822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
11848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
11858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
11868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
11878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
11882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_STATS_FACE_DETECTION_OFF) {
11908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
11918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
11928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return INVALID_OPERATION;
11938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
11942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
11958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
11978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
11998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
120136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
120236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1203228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
12048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
12058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
12068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1208228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
12098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1210228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
12118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
12142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1215228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
12168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
121936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
122036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
122136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
12222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1224174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
122536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
122636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
122736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
122836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
122936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
12302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1232983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
123336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
123436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
123536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
123636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
123736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
123836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
12398da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
124036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
124136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
124236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1243c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1244c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
124573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->setRecordingBufferCount(count);
124661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
124761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
12493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1250160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1251160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1252160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1253160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1254160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1255160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1256160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            frameNumber, timestamp);
1257160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1258160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1259160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1260160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1261160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1262174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1263174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1264174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1265174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1266174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1267174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
12682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
12692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1270174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1271174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1272174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1273174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1274174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1276174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1277174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1278174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1279174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1280174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1281174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1283174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1284174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1285174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1286174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1287174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1288174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1289174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1290174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1291174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1292174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1293174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1294174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1295174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1296174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1297174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1298174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1299174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1300174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1301174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1302174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1303174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1304174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1305174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1306174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1307174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1308174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1310174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1311174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1314174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1315174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1317174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1318174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1319174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1320174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1321174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
13222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1324174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1325174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1326174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1327174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1328174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1329174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1330174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1331174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1332174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1334174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1335174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1336174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1337174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
13382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1339174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1340174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1341174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1342174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1343174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1344174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1345a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1346a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1347a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1348a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1349174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1350174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1351174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1352174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
1353a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1354a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1355a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
13568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
13578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1358174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1359603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
1360a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1361a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1362a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1363a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
13648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1365603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1366160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1367160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1368160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1369160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1370160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1371da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1372160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1373160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1374160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1375160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1376160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1377160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1378160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1379da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCameraId() const {
1380a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mCameraId;
1381c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1382c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1383a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaconst sp<Camera2Device>& Camera2Client::getCameraDevice() {
1384a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mDevice;
1385c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1386c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1387609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvalaconst sp<CameraService>& Camera2Client::getCameraService() {
1388609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    return mCameraService;
1389609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala}
1390609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
1391a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1392a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1393c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1394c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1395da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const {
139673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getPreviewStreamId();
1397da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1398da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1399da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const {
1400da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mJpegProcessor->getStreamId();
1401da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1402da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1403da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const {
1404da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mCallbackProcessor->getStreamId();
1405da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1406da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1407da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const {
140873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getRecordingStreamId();
1409da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1410da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1411da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getZslStreamId() const {
1412da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mZslProcessor->getStreamId();
1413da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1414da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
14154865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
14164865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
14174865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mFrameProcessor->registerListener(minId, maxId, listener);
14184865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
14194865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
14204865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1421da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
14224865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mFrameProcessor->removeListener(minId, maxId, listener);
1423da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1424da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
14254865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::stopStream() {
14264865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mStreamingProcessor->stopStream();
1427da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1428da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1429a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1430a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mCameraClient(client.mCameraClient),
1431a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedClient(client) {
1432a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.lock();
1433c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1434c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1435a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::~Lock() {
1436a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.unlock();
14378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
14388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1439ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville TalvalaCamera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1440ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        mCameraClient(client) {
1441ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala}
1442ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
1443a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1444a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        const sp<ICameraClient>&client) {
1445a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1446a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient = client;
1447a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return *this;
1448a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}
14492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1450a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalavoid Camera2Client::SharedCameraClient::clear() {
1451a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1452a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient.clear();
14538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
14548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
14554865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart;
14564865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd;
14574865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart;
14584865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd;
14594865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart;
14604865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd;
1461da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
14623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
14633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
14645a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters &params) {
14658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
14668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
146722d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
146822d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
14694865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mStreamingProcessor->incrementStreamingIds();
14704865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res != OK) {
14714865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
14724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
14734865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        return res;
14744865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
14754865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
147673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewRequest(params);
14778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
14788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
14798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
14808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
14818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
148273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updateRecordingRequest(params);
14838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
14848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
14858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
14868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
14878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
14888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
14892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
14905a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        res = startPreviewL(params, true);
14918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
14928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
14938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
14948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
14958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
14962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
149873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = startRecordingL(params, true);
14998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
15008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
15018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
15028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
15038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
15048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
15058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
15068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1509228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
1510228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
1511228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
1512228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1513228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1514228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1515228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
1516228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1517228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1518228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1519228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
1520f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1521228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
1522228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
1523228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1524228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
1525228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1526228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
1527228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
1528228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1529228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1530228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
1531228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
1532228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
1533228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
1534228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1535228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
15368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15374865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::syncWithDevice() {
15384865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    ATRACE_CALL();
15394865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    const nsecs_t kMaxSyncTimeout = 100000000; // 100 ms
15404865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
15414865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
15424865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
15434865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (activeRequestId == 0) return OK;
15444865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
15454865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
15464865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res == TIMED_OUT) {
15474865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
15484865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
15494865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    } else if (res != OK) {
15504865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
15514865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
15524865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
15534865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return res;
15544865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
15554865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
155661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
1557