Camera2Client.cpp revision d32b99b1a87497280add6efc0e99bd383e402de1
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 Talvala// Interface used by CameraService
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
46ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin        int clientPid,
47ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin        int servicePid):
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        Client(cameraService, cameraClient,
49ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin                cameraId, cameraFacing, clientPid, servicePid),
50ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        mSharedCameraClient(cameraClient),
5173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mParameters(cameraId, cameraFacing)
52f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
53a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Opened", cameraId);
5561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
56f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
57228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
623a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const {
633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    int callingPid = getCallingPid();
64c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    if (callingPid == mClientPid) return NO_ERROR;
653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    ALOGE("%s: attempt to use a locked camera from a different process"
67c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    return PERMISSION_DENIED;
693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala}
703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
73a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
74c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
84174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->setNotifyCallback(this);
85174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.initialize(&(mDevice->info()));
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    String8 threadName;
96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
9773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor = new StreamingProcessor(this);
9873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
99ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    mFrameProcessor = new FrameProcessor(this);
1004bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-FrameProc",
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mFrameProcessor->run(threadName.string());
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer = new CaptureSequencer(this);
1054bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CaptureSeq",
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->run(threadName.string());
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
1104bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-JpegProc",
111ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala            mCameraId);
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->run(threadName.string());
113ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
1154bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-ZslProc",
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mZslProcessor->run(threadName.string());
118ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
119d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor = new CallbackProcessor(this);
1204bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CallbkProc",
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCallbackProcessor->run(threadName.string());
123d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
1272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGD("%s", l.mParameters.paramsFlattened.string());
128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
13161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
134a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1354ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
137f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
138c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    disconnect();
139c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Closed", mCameraId);
14161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
144611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
146611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
147611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
148611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
153836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
158836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
160836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
162836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
16311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
164836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
166836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
168836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
170836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
171836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
173836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
174836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
176836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
177836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
179836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
181836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
185836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
186d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO)
187d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT)
188d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT)
189d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT)
190d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT)
191d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)
192d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT)
193d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE)
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
198836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
199d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF)
200d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO)
201d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE)
202d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE)
203d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA)
204d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE)
205d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD)
206d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD)
207d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA)
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
212836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
213d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO)
214d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF)
215d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ)
216d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ)
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
221836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
243836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
254836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
266d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    result.append("   Focus state: ");
267d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    switch (p.focusState) {
268d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE)
269d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
270d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
271d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN)
272d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED)
273d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
274d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        default: result.append("UNKNOWN\n");
275d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    }
276d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala
2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
278836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
280836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
281836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
282836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
283836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
284836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
2857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
291836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
292836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
2937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
295836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
2967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
297836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
298836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
299836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
300836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
301836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
3027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
305836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
306836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
3077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3083297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
309836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
3107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
312836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
3137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
315da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n",
316da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId());
317ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n",
318da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getCaptureStreamId());
319da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n",
320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId());
321e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
322e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    result.append("  Quirks for this camera:\n");
323e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    bool haveQuirk = false;
324e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.triggerAfWithAuto) {
325e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    triggerAfWithAuto\n");
326e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
327e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
328e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.useZslFormat) {
329e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    useZslFormat\n");
330e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
331e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
3327373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (p.quirks.meteringCropRegion) {
3337373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        result.appendFormat("    meteringCropRegion\n");
3347373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        haveQuirk = true;
3357373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
336e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (!haveQuirk) {
337e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    none\n");
338e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
339e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
34073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    write(fd, result.string(), result.size());
3413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
34273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->dump(fd, args);
343428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
344da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->dump(fd, args);
345da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
346c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
347c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
34897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala    mZslProcessor->dump(fd, args);
34997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala
3503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
351611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
3527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
3543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
3553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
3563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
3573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3583297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
361611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
36261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
36361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
36561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
367a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
368ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
369c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala
370c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    // Allow both client and the media server to disconnect at all times
371c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    int callingPid = getCallingPid();
372c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    if (callingPid != mClientPid && callingPid != mServicePid) return;
373ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
375f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
37698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Shutting down", mCameraId);
37798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
378d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    stopPreviewL();
3796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
38098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    {
38198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
382c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala        if (l.mParameters.state == Parameters::DISCONNECTED) return;
38398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        l.mParameters.state = Parameters::DISCONNECTED;
38498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    }
38598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
38673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->deletePreviewStream();
38773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->deleteRecordingStream();
388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->deleteStream();
389d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor->deleteStream();
390cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala    mZslProcessor->deleteStream();
391cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala
39298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mFrameProcessor->requestExit();
39398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCaptureSequencer->requestExit();
39498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mJpegProcessor->requestExit();
39598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mZslProcessor->requestExit();
39698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCallbackProcessor->requestExit();
39798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
39898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Waiting for threads", mCameraId);
39998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
40098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mFrameProcessor->join();
40198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCaptureSequencer->join();
40298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mJpegProcessor->join();
40398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mZslProcessor->join();
40498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCallbackProcessor->join();
40598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
40698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Disconnecting device", mCameraId);
40798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
40898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mDevice->disconnect();
40998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
4103a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
4118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
41261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
41361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
41461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
41561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
416a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4179e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
418ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
419ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
4219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
4229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
4239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
4249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
4259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
4288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
4299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = client;
430a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedCameraClient = client;
4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
43361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
43461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
43561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
436a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4379e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
438ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
441ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
45461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
45561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
45661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
457a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4589e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
459ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
462ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
464907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        SharedParameters::Lock l(mParameters);
465907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        if (l.mParameters.state == Parameters::RECORD ||
466907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
467907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala            ALOGD("Not allowed to unlock camera during recording.");
468907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala            return INVALID_OPERATION;
469907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        }
4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
472a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedCameraClient.clear();
4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
47961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
48061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
483a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4849e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
485ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4863a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
488ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
4926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
49636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder,window);
49761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
49861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
5006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
501a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5029e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
503ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5043a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5053a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
506ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
5076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
5086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
5096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
5106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
5116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
5126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
51336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
5146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
51636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
518a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
5229e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
5239e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
5256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
527f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    Parameters::State state;
528f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    {
529f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        SharedParameters::Lock l(mParameters);
530f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        state = l.mParameters.state;
531f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    }
532f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    switch (state) {
5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
539f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                    Parameters::getStateName(state));
5409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
5474865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            mStreamingProcessor->stopStream();
548f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala            state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
552bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
55373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->setPreviewWindow(window);
55473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (res != OK) {
55573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Unable to set new preview window: %s (%d)",
55673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
55773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        return res;
55873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
559bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
560f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
561f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        SharedParameters::Lock l(mParameters);
562f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        l.mParameters.state = state;
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
56761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
56861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
56961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
570a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
572ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
573ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin
574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
581228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
584228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        switch(params.state) {
5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startRecordingL(params, true);
595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
600228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
604228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
605228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
60661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
60761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
609a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6109e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
611ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6123a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
616d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
617ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
619d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
6206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
62122d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
62222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
62322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
624a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala    if ( (params.state == Parameters::PREVIEW ||
625a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                    params.state == Parameters::RECORD ||
626a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                    params.state == Parameters::VIDEO_SNAPSHOT)
627a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala            && !restart) {
628a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        // Succeed attempt to re-enter a streaming state
629a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        ALOGI("%s: Camera %d: Preview already active, ignoring restart",
630a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                __FUNCTION__, mCameraId);
63177449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray        return OK;
63277449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    }
63377449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    if (params.state > Parameters::PREVIEW && !restart) {
6344ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
6374ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
6384ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
6396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
64073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!mStreamingProcessor->haveValidPreviewWindow()) {
6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
6426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
6436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
6459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
64673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewStream(params);
647be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
650be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
6516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
65273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
65373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    Vector<uint8_t> outputStreams;
654228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
655228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
656228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
657d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
658228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
659228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
660228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
661228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
662228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
66373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getCallbackStreamId());
664228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
6655a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    if (params.zslMode && !params.recordingHint) {
666da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mZslProcessor->updateStream(params);
667da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
668da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
669da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
670da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
671da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
67273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getZslStreamId());
673da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
6746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
67573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
67673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
6775a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    if (!params.recordingHint) {
67873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
67973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updatePreviewRequest(params);
6805a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            if (res != OK) {
68173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request: "
68273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId,
68373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
6845a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                return res;
6855a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            }
6865a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        }
68773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
68873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
6895a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    } else {
6905a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        // With recording hint set, we're going to be operating under the
6915a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        // assumption that the user will record video. To optimize recording
6925a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        // startup time, create the necessary output streams for recording and
6935a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        // video snapshot now if they don't already exist.
6945a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        res = mJpegProcessor->updateStream(params);
6955a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        if (res != OK) {
6965a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't pre-configure still image "
6975a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                    "stream: %s (%d)",
698be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
699be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
700be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
701da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
70273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
70373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updateRecordingRequest(params);
70473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            if (res != OK) {
70573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request with "
70673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "record hint: %s (%d)", __FUNCTION__, mCameraId,
70773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
70873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                return res;
70973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            }
71073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
71173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
71273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
713be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
714be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
71573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
716be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
7186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
7216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
72261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
72361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
72461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
725a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7269e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
727ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7283a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7293a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
73036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
731ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
732ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
73336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
734ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
7354865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
736d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds
7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
738228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
741228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
742228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
743228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
745d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
746d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
747d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
749d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
751d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout);
752d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            // no break
7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
75573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            mStreamingProcessor->stopStream();
7564865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            res = mDevice->waitUntilDrained();
7574865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            if (res != OK) {
7584865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
7594865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
7604865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            }
761228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
766d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
767228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
768d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
769d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
770228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
771d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
77261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
77361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
77461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
775a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
776ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
7793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
78261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
78361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
78461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
785a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
786ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7883a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
79478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
79778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
79878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
79978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
80078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
80178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
80278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
80478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
80578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
80661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
80761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
80861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
809a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8109e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
811ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
8133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
8142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
815228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
8183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
820228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
82122d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
82222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
82322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
824228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
8252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
8279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
8289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
8309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
8319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
834228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
835228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
836228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
8379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
8399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
8429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
8439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
8449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
845228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
84678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
84778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
84878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
84978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
85078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
85178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
85273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!restart) {
85373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mCameraService->playSound(CameraService::SOUND_RECORDING);
85473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mStreamingProcessor->updateRecordingRequest(params);
85573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (res != OK) {
85673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
85773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
85873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            return res;
85973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
86073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
861609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
86273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updateRecordingStream(params);
8639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
8659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
86873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
86973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    Vector<uint8_t> outputStreams;
870228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
871228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
872228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
873d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
874228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
875228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
876228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
877228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
878228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
87973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getCallbackStreamId());
880228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
88173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
88273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getRecordingStreamId());
8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
88473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
88573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            outputStreams);
8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
88773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
8932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
894228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
89761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
89861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
89961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
900a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9019e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
902ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
904228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
9059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
9063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
9073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
9092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
9119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
9142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
9152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
9169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
9179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
9182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
9209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
9219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
9229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
923609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
924609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
9255a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    res = startPreviewL(l.mParameters, true);
9269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
9275a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to return to preview",
9285a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                __FUNCTION__, mCameraId);
9299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
93061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
93161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
93261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
933a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
934ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9358da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9363a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
9373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9388da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
9398da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
9408da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9418da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
9428da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
9432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9448da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
9462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
94761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
94861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
94961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
950a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
951ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9523a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
95330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
95473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->releaseRecordingFrame(mem);
95561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
95661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
95761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
958a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
959ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
9613a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9623a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
964174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
965d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    bool notifyImmediately = false;
966d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    bool notifySuccess = false;
967174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
9682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
9694865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        if (l.mParameters.state < Parameters::PREVIEW) {
9704865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            return INVALID_OPERATION;
9714865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        }
9724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
9735f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        /**
9745f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * If the camera does not support auto-focus, it is a no-op and
9755f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * onAutoFocus(boolean, Camera) callback will be called immediately
9765f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * with a fake value of success set to true.
9775f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          */
9785f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED) {
979d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifyImmediately = true;
980d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifySuccess = true;
981d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        }
982d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
983d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * If we're in CAF mode, and AF has already been locked, just fire back
984d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * the callback right away; the HAL would not send a notification since
985d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * no state change would happen on a AF trigger.
986d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
987d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE ||
988d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) &&
989d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) {
990d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifyImmediately = true;
991d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifySuccess = true;
992d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        }
993d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
994d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * Send immediate notification back to client
995d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
996d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        if (notifyImmediately) {
9975f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            SharedCameraClient::Lock l(mSharedCameraClient);
9985f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            if (l.mCameraClient != 0) {
9995f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin                l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1000d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                        notifySuccess ? 1 : 0, 0);
10015f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            }
10025f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            return OK;
10035f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        }
1004d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1005d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * Handle quirk mode for AF in scene modes
1006d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
100795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        if (l.mParameters.quirks.triggerAfWithAuto &&
100895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED &&
1009ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala                l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO &&
1010ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala                !l.mParameters.focusingAreas[0].isEmpty()) {
101195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
101295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                    __FUNCTION__, l.mParameters.focusMode);
101395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.shadowFocusMode = l.mParameters.focusMode;
101495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
101595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            updateRequests(l.mParameters);
101695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        }
101795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala
10182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
10192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
1020174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
10214865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
1022174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1023174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
1024174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
102661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
102761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
102861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
1029a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1030ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
10318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
10323a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
10333a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10343a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1035174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1036174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
10372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
10382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
103995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala
104095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        // When using triggerAfWithAuto quirk, may need to reset focus mode to
1041ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala        // the real state at this point. No need to cancel explicitly if
1042ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala        // changing the AF mode.
104395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
104495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
104595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                    l.mParameters.shadowFocusMode);
104695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.focusMode = l.mParameters.shadowFocusMode;
104795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
104895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            updateRequests(l.mParameters);
1049ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala
1050ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala            return OK;
105195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        }
1052174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
10534865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
1054174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1055174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1056174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
105861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
105961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1060ff82370c7c04340d50673d425f48acafd00f2bc9Ben Murdochstatus_t Camera2Client::takePicture(int msgType) {
1061a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1062ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1063d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
10643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1065d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1066b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala    {
1067b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        SharedParameters::Lock l(mParameters);
1068b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        switch (l.mParameters.state) {
1069b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::DISCONNECTED:
1070b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::STOPPED:
1071b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1072b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1073da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        __FUNCTION__, mCameraId);
1074b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                return INVALID_OPERATION;
1075b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::PREVIEW:
1076b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                // Good to go for takePicture
1077b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                res = commandStopFaceDetectionL(l.mParameters);
1078b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                if (res != OK) {
1079b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1080b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                            __FUNCTION__, mCameraId);
1081b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    return res;
1082b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                }
1083b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                l.mParameters.state = Parameters::STILL_CAPTURE;
1084b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                break;
1085b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::RECORD:
1086b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                // Good to go for video snapshot
1087b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1088b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                break;
1089b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::STILL_CAPTURE:
1090b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
1091b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                ALOGE("%s: Camera %d: Already taking a picture",
1092b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                        __FUNCTION__, mCameraId);
1093b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                return INVALID_OPERATION;
1094b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        }
1095d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1096b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1097d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1098b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        res = mJpegProcessor->updateStream(l.mParameters);
1099b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        if (res != OK) {
1100b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1101b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1102b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            return res;
1103b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        }
1104228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
11058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11064865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    // Need HAL to have correct settings before (possibly) triggering precapture
11074865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
11084865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
1109aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin    res = mCaptureSequencer->startCapture(msgType);
1110d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1112d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return res;
111661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
111761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
111861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1119a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1121ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
11233a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11243a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
11282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
11299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
11318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
113361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1134f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
113561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1136a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1138ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1140ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1142ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    return l.mParameters.get();
114461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
114561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
114661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1147a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1148ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
11503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1151c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1152c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1153c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1154c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
115536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
115636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
115736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
115836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
115936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
116036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
116136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
116236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
116336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
116436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
116536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
116636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
116736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1168228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1171228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
117236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
117336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
117436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
117536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
117636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
117736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
117836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
117936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
118036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1181c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
118236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
118336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
118436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
118536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
118636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
118736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
118836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
118936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
119036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
119136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
119236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
119336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
119436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
119536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
119736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
119836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
119936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
120036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
120136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
120236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
12032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
120573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            getPreviewStreamId() != NO_STREAM) {
120673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mDevice->setStreamTransform(getPreviewStreamId(), transform);
120736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
12082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
120936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
121036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
121136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
121236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
121436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
12152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1216c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
121736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1218983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
121936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
122036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
122136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
122236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
122336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
122436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
122536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
122636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
122736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
122836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
122936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1230983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
123136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1232983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
12332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
123436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
123536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1236983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
123736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
123836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
123936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
124036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
124136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1242ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinstatus_t Camera2Client::commandStartFaceDetectionL(int /*type*/) {
12438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
12448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
12482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
12492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
12502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
12512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
12528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
12538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
12548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
12562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
12588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
12598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
12608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
12622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
1263d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
12648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
12658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
12668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return INVALID_OPERATION;
12678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
12698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
12718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
12738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
127536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
127636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1277228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
12788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
12798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
12808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1282228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
12838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1284228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
12858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1289228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
12908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
129336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
129436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
129536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1298174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
129936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
130036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
130136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
130236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
130336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1306983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
130736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
130836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
130936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
131036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
131136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
131236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
13138da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
131436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
131536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
131636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1317c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1318c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
131973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->setRecordingBufferCount(count);
132061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
132161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
13233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1324160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1325160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1326160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1327160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1328160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1329ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin    (void)frameNumber;
1330ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin    (void)timestamp;
1331160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1332160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            frameNumber, timestamp);
1333160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1334160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1335160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1336160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1337160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1338174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1339174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1340174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1341174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1342174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1343174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
1345d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        l.mParameters.focusState = newState;
13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1347174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1348174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1349174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1350174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1351174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
13522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1353174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1354174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1355174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1356174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1357174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1358174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
13592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1360174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1361174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1362174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1363174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1364174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1365174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1366174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1367174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1368174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1369174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1370174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1371174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1372174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1373174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1374174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1375174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1376174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1377174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1380174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1382174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1383174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1384174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1385174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1387174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1388174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
13892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
13902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1391174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1392174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
13932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1394174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1395174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1396174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1397174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1398174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
13992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
14002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1401174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1402174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1403174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1406174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1407174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1408174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1409174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
14102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1411174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1412174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1413174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1414174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
14152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1416174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1417174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1418174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1419174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1420174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1421174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1422a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1423a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1424a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1425a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1426174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1427174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1428174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1429174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
1430a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1431a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1432a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
14338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
14348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1435174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1436603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
1437a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1438a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1439a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1440a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
14418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1442603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1443160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1444160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1445160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1446160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1447160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1448da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1449160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1450160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1451160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1452ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin    (void)newState;
1453ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin    (void)triggerId;
1454160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1455160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1456160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1457160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1458da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCameraId() const {
1459a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mCameraId;
1460c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1461c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1462a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaconst sp<Camera2Device>& Camera2Client::getCameraDevice() {
1463a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mDevice;
1464c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1465c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1466609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvalaconst sp<CameraService>& Camera2Client::getCameraService() {
1467609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    return mCameraService;
1468609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala}
1469609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
1470a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1471a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1472c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1473c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1474da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const {
147573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getPreviewStreamId();
1476da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1477da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1478da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const {
1479da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mJpegProcessor->getStreamId();
1480da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1481da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1482da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const {
1483da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mCallbackProcessor->getStreamId();
1484da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1485da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1486da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const {
148773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getRecordingStreamId();
1488da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1489da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1490da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getZslStreamId() const {
1491da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mZslProcessor->getStreamId();
1492da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1493da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
14944865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
14954865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
14964865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mFrameProcessor->registerListener(minId, maxId, listener);
14974865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
14984865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
14994865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1500da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
15014865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mFrameProcessor->removeListener(minId, maxId, listener);
1502da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1503da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
15044865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::stopStream() {
15054865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mStreamingProcessor->stopStream();
1506da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1507da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1508a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1509a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mCameraClient(client.mCameraClient),
1510a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedClient(client) {
1511a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.lock();
1512c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1513c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1514a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::~Lock() {
1515a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.unlock();
15168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1518ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville TalvalaCamera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1519ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        mCameraClient(client) {
1520ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala}
1521ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
1522a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1523a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        const sp<ICameraClient>&client) {
1524a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1525a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient = client;
1526a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return *this;
1527a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}
15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1529a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalavoid Camera2Client::SharedCameraClient::clear() {
1530a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1531a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient.clear();
15328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart;
15354865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd;
15364865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart;
15374865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd;
15384865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart;
15394865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd;
1540da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
15413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
15423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
15435a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters &params) {
15448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
15458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
154622d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
154722d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
15484865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mStreamingProcessor->incrementStreamingIds();
15494865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res != OK) {
15504865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
15514865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
15524865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        return res;
15534865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
15544865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
155573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewRequest(params);
15568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
15578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
15588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
15598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
15608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
156173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updateRecordingRequest(params);
15628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
15638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
15648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
15658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
15668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
15678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
15695a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        res = startPreviewL(params, true);
15708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
15718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
15728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
15738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
15748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
157773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = startRecordingL(params, true);
15788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
15798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
15808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
15818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
15828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
15838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
15848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
15858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
1589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
1590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
1591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
1595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
1599f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1600228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
1601228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
1602228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
1604228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1605228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
1606228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
1607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1609228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
1610228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
1611228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
1612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
1613228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
16158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16164865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::syncWithDevice() {
16174865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    ATRACE_CALL();
161843b7ac6bd1a949ecb8ffc7e50d0a2f01a6258034Eino-Ville Talvala    const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms
16194865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
16204865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
16214865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
16224865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (activeRequestId == 0) return OK;
16234865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
16244865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
16254865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res == TIMED_OUT) {
16264865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
16274865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
16284865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    } else if (res != OK) {
16294865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
16304865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
16314865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
16324865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return res;
16334865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
16344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
163561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
1636