Camera2Client.cpp revision d86a6880fe86bda21a9b53b240996fc410a512a5
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
1761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define LOG_TAG "Camera2Client"
18a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
20a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
21f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Log.h>
22a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#include <utils/Trace.h>
2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <cutils/properties.h>
2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/SurfaceTextureClient.h>
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h>
2778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala#include <media/hardware/MetadataBufferType.h>
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Client.h"
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalausing namespace camera2;
372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingUid() {
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingUid();
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int clientPid):
5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        Client(cameraService, cameraClient,
54f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                cameraId, cameraFacing, clientPid),
55ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        mSharedCameraClient(cameraClient),
562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        mParameters(cameraId, cameraFacing),
57d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId(NO_STREAM),
589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingStreamId(NO_STREAM),
59983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapCount(kDefaultRecordingHeapCount)
60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
61a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
62c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Created client for camera %d", __FUNCTION__, cameraId);
6361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
65228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const {
713a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    int callingPid = getCallingPid();
723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if (callingPid == mClientPid) return NO_ERROR;
733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    ALOGE("%s: attempt to use a locked camera from a different process"
753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    return PERMISSION_DENIED;
773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala}
783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
81a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
82c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
92174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->setNotifyCallback(this);
93174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.initialize(&(mDevice->info()));
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
101f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
103ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    mFrameProcessor = new FrameProcessor(this);
104ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    String8 frameThreadName = String8::format("Camera2Client[%d]::FrameProcessor",
105ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala            mCameraId);
106ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    mFrameProcessor->run(frameThreadName.string());
107ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
108ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    mCaptureProcessor = new CaptureProcessor(this);
109ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    String8 captureThreadName =
110ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala            String8::format("Camera2Client[%d]::CaptureProcessor", mCameraId);
111ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    mCaptureProcessor->run(captureThreadName.string());
112ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
113d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor = new CallbackProcessor(this);
114d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    String8 callbackThreadName =
115d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala            String8::format("Camera2Client[%d]::CallbackProcessor", mCameraId);
116d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor->run(callbackThreadName.string());
117d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala
118f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
119f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
1212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGD("%s", l.mParameters.paramsFlattened.string());
122f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
123f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
12561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
12661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
128a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
129c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Camera %d: Shutting down client.", __FUNCTION__, mCameraId);
1304ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
131f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
132f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1333a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    // Rewrite mClientPid to allow shutdown by CameraService
1343a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mClientPid = getCallingPid();
135f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
136c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
137c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->requestExit();
138c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Camera %d: Shutdown complete", __FUNCTION__, mCameraId);
13961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
142611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
144611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
145611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
146611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
151836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1544ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
156836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
158836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
160836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
16111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
162836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
164836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
166836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
168836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
169836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
171836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
172836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
174836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
175836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
177836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
179836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
183836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
196836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
210836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
219836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
241836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
252836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
265836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
267836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
268836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
269836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
270836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
271836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
275836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
278836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
279836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
282836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
2837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
284836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
285836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
286836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
287836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
291836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
292836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
293836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
2947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
296836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
2977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
299836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
3007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
3023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n", mPreviewStreamId);
303ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n",
304ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala            mCaptureProcessor->getStreamId());
305836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n", mRecordingStreamId);
3063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
3073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current requests:\n");
308cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() != 0) {
3093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request:\n");
3103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
311cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mPreviewRequest.dump(fd, 2, 6);
3123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
3133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request: undefined\n");
3143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
317cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() != 0) {
3183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request:\n";
3193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
320cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mCaptureRequest.dump(fd, 2, 6);
3213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
3223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request: undefined\n";
3233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
326cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() != 0) {
327428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request:\n";
328428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
329cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mRecordingRequest.dump(fd, 2, 6);
330428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    } else {
331428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request: undefined\n";
332428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
333428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    }
334428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
335c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
336c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
3373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
338611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
3397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
3413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
3423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
3433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
3443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
348611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
34961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
35061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
35161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
35261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
35361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
354a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3559e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
356ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
3573a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
3583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
359ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
36236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
3636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
364d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
366d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId = NO_STREAM;
367d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
368d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
369ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    mCaptureProcessor->deleteStream();
370f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
371898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
372898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mDevice->deleteStream(mRecordingStreamId);
373898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mRecordingStreamId = NO_STREAM;
374898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    }
375898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
376d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor->deleteStream();
377228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
3792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
3818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
38261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
38361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
38461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
386a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3879e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
388ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
389ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
3909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
3919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
3929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
3939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
3949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
3959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
3969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
3988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
3999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = client;
400a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedCameraClient = client;
4019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::STOPPED;
404228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
4059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
40661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
40761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
40861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
409a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4109e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
411ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
414ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
42761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
42861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
42961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
430a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4319e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
432ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
435ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Check for uninterruptable conditions
4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
441a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedCameraClient.clear();
4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
44861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
452a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4539e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
454ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4553a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4563a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
457ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
4616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
46536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder,window);
46661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
46761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
4696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
470a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4719e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
472ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
475ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
4796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
48236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
4836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
48536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
486be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
487a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
4919e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
4929e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
4936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
4946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
5129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Optimize this so that we don't wait for old stream to drain
5139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // before spinning up new stream
514cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
519d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->waitUntilDrained();
521be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
523be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
524be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
525be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
5276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
528be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
529be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
5306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
5316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
532be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        mPreviewStreamId = NO_STREAM;
5336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
535bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
536be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mPreviewWindow = window;
537bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
54361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
54461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
54561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
546a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
547228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
548ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
550228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
551228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
554228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
555228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
556228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
557228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
558228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
559228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
560228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
561228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
562228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
563228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
564228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        switch(params.state) {
5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
566228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
567228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startRecordingL(params, true);
571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
572228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
576228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
581228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
58261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
58361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
58461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
585a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5869e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
587ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5883a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
592d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
593ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
595d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
5966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state >= Parameters::PREVIEW && !restart) {
5984ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
6014ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
6024ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
6036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
604be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewWindow == 0) {
6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
6066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
6076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
6099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
610228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updatePreviewStream(params);
611be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
612be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
613be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
614be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
6156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
619d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
620228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
621228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
622228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
623228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
624228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
625228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
6266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
627cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
628228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updatePreviewRequest(params);
629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
630be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
631be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
632be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
633be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
6346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
637228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[2] =
638d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                { mPreviewStreamId, mCallbackProcessor->getStreamId() };
639cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mPreviewRequest.update(
640228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
641228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 2);
642228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else {
643cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        uint8_t outputStreams[1] = { mPreviewStreamId };
644cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mPreviewRequest.update(
645228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
646cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                outputStreams, 1);
647228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
6486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
6496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
6506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
651be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
652be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
653cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mPreviewRequest.sort();
654be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
655be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
656be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
6616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
662bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
663bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
6646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
6686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
67061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
67161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
67261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
673a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6749e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
675ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
67836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
679ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
680ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
68136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
682ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
684228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
6862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
687228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
688228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
689228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
6902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
691d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
692d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
693d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
695d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
697d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
698d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
699d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
701228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break - identical to preview
7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
703cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
7042267106c98f461b730c772a913da946c391a178cEino-Ville Talvala            mDevice->waitUntilDrained();
705228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
710d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
711228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
712d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
713d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
714228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
715d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
71661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
71761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
71861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
719a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
720ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7213a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7223a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
7233a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
72661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
72761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
72861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
729a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
730ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7313a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7323a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7333a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
73878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
74178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
74278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
74378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
74478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
74578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
74678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
7472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
74878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
74978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
75061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
75161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
75261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
753a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7549e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
755ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
7573a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
759228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
761228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
7623a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
763228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
764228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
765228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
7662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
767228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
7689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
7699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
7719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
7729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
775228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
776228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
777228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
7789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
7809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
7839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
7849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
7859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
786228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
78778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
78878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
78978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
79078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
79178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
79278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
793228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updateRecordingStream(params);
7949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
7969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
799228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
800228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
801228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
802d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
803228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
804228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
805228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
806228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
807228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
810cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
811228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRecordingRequest(params);
8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
8139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
8149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
8159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
8169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
8179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
820228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[3] =
821d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                { mPreviewStreamId, mRecordingStreamId,
822d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                  mCallbackProcessor->getStreamId() };
823cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
824228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
825228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 3);
826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else {
827228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId };
828cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
829228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
830228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 2);
831228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
8349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
837cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mRecordingRequest.sort();
8389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
8409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mRecordingRequest);
8459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set recording request to start "
8479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "recording: %s (%d)", __FUNCTION__, mCameraId,
8489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
8499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
853228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
85661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
85761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
85861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
859a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8609e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
861ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
863228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
8653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
8663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
8672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
8709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
8722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
8732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
8742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
8759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
8769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
8772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
8782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
8799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
8809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
8819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Back to preview. Since record can only be reached through preview,
8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // all preview stream setup should be up to date.
8849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
8859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to switch back to preview request: "
8879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Should recording heap be freed? Can't do it yet since requests
8929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // could still be in flight.
8939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::PREVIEW;
89561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
89661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
89761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
898a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
899ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9008da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9013a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
9023a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9038da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
9048da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
9058da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9068da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
9078da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9098da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
9112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
91261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
91361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
91461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
915a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
916ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9173a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
91930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
92130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Make sure this is for the current heap
9239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ssize_t offset;
9249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t size;
9259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
9269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
9279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
9289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "(got %x, expected %x)", __FUNCTION__, mCameraId,
9299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
9309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
9319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
93278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint8_t *data = (uint8_t*)heap->getBase() + offset;
93378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint32_t type = *(uint32_t*)data;
93478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (type != kMetadataBufferTypeGrallocSource) {
93578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
93678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
93778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
93878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
93930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
94030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    // Release the buffer back to the recording queue
94130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
94230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
94330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
94430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    size_t itemIndex;
94530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
94630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
94730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
94830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                item.mGraphicBuffer->handle == imgHandle) {
94930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            break;
95030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        }
95130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
95230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    if (itemIndex == mRecordingBuffers.size()) {
95330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
95430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
95530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        return;
95630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
95730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
95878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
95930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            imgHandle);
96030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
96130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
96278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (res != OK) {
96378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
96478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "%s (%d)",
96530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
96678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
96778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
96830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    mRecordingBuffers.replaceAt(itemIndex);
96978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
9709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mRecordingHeapFree++;
97161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
97261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
97361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
974a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
975ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
979174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
980174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
9812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
9822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
9832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
984174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
985174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
986174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
987174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
9886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
98961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
99061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
99161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
992a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
993ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9963a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
997174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
998174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
9992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
10002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
1001174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1002174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1003174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1004174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
100661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
100761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
100861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
1009a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1010ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1011d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
10123a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1013d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
10152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
10162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
10172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
10182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1019d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1020d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1021d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
10222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
10232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
1024d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
1025d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
10262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
10272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
1028d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
1029d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1030d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1031d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1032d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1034d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1035ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    res = mCaptureProcessor->updateStream(l.mParameters);
1036228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (res != OK) {
1037228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1038228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1039228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return res;
1040228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
10418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1042cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
10432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        res = updateCaptureRequest(l.mParameters);
10444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        if (res != OK) {
1045228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't create still image capture request: "
1046228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
10474ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return res;
10484ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
1049d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1050d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    bool callbacksEnabled = l.mParameters.previewCallbackFlags &
1052228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
10532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    bool recordingEnabled = (l.mParameters.state == Parameters::RECORD);
1054228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1055ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    int captureStreamId = mCaptureProcessor->getStreamId();
1056ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
1057228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    int streamSwitch = (callbacksEnabled ? 0x2 : 0x0) +
1058228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            (recordingEnabled ? 0x1 : 0x0);
1059228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch ( streamSwitch ) {
1060228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 0: { // No recording, callbacks
1061d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala            uint8_t streamIds[2] = {
1062d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                mPreviewStreamId,
1063d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                captureStreamId
1064d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala            };
1065cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1066cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 2);
1067228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1068228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1069228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 1: { // Recording
1070d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala            uint8_t streamIds[3] = {
1071d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                mPreviewStreamId,
1072d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                mRecordingStreamId,
1073d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                captureStreamId
1074d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala            };
1075cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1076cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 3);
1077228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1078228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1079228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 2: { // Callbacks
1080d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala            uint8_t streamIds[3] = {
1081d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                mPreviewStreamId,
1082d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                mCallbackProcessor->getStreamId(),
1083d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                captureStreamId
1084d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala            };
1085cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1086cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 3);
1087228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1088228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1089228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 3: { // Both
1090d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala            uint8_t streamIds[4] = {
1091d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                mPreviewStreamId,
1092d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                mCallbackProcessor->getStreamId(),
1093d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                mRecordingStreamId,
1094d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala                captureStreamId
1095d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala            };
1096cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1097cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 4);
1098228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1099228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1100228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    };
1101d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1102d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
1103d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
1104d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1105d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
1106d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1107cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.sort();
1108be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1109be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)",
1110be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1111be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1112be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1114cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
1115cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
1116d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
1117d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
1118d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return NO_MEMORY;
1119d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1120d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
11212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state == Parameters::PREVIEW) {
1122cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mDevice->clearStreamingRequest();
1123d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1124d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
1125d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)",
1126d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1127d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
1128d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1129d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
11309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
1131d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = mDevice->capture(captureCopy);
1132d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1133d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
1134d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
1135d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1136d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
1137d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1138d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
11392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
11402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STILL_CAPTURE;
11422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            res = commandStopFaceDetectionL(l.mParameters);
11438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            if (res != OK) {
11448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
11458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                        __FUNCTION__, mCameraId);
11468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                return res;
11478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
1148d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
11492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
11502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1151d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
1152d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
1153d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state for still capture!",
1154d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1155d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1156d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1157d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1158d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
115961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
116061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
116161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1162a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11639e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1164ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
11663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11673a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
11712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
11729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
11748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
117661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1177f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
117861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1179a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1180ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11813a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1182ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1184ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
11862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.paramsFlattened;
118761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
118861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
118961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1190a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1191ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11923a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
11933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1194c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1195c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1196c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1197c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
119836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
119936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
120036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
120136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
120236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
120336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
120436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
120536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
120636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
120736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
120836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
120936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
121036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1211228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
12122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1214228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
121536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
121636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
121736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
121836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
121936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
122036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
122136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
122236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
122336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1224c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
122536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
122636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
122736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
122836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
122936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
123036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
123136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
123236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
123336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
123436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
123536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
123636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
123736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
123836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
12392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
124036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
124136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
124236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
124336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
124436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
124536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
124836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mPreviewStreamId != NO_STREAM) {
124936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mDevice->setStreamTransform(mPreviewStreamId, transform);
125036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
12512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
125236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
125336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
125436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
125536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
12562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
125736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
12582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1259c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
126036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1261983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
126236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
126336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
126436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
126536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
126636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
126736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
126836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
126936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
127036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
127136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
127236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1273983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
127436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1275983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
12762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
127736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
127836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1279983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
128036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
128136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
128236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
128336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
128436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
128536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartFaceDetectionL(int type) {
12868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
12878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
12912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
12922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
12932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
12942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
12958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
12968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
12978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
13018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
13028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
13038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
13048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_STATS_FACE_DETECTION_OFF) {
13078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
13088ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
13098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return INVALID_OPERATION;
13108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
13128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
13148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
13168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
131836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
131936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1320228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
13218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
13228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
13238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
13248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1325228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
13268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1327228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
13288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
13312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1332228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
13338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
13348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
133636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
133736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
133836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1341174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
134236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
134336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
134436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
134536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
134636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
13472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1349983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
135036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
135136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
135236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
135336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
135436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
135536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
13568da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
135736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
135836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
135936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1360c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1361c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
136236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // 32 is the current upper limit on the video buffer count for BufferQueue
136336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (count > 32) {
136436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
136536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, count);
136636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
136736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
136836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
136936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Need to reallocate memory for heap
137036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (mRecordingHeapCount != count) {
137136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if  (mRecordingHeap != 0) {
137236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap.clear();
137336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap = NULL;
137436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        }
137536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mRecordingHeapCount = count;
137636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1377c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
13786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
137961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
138061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
13823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1383160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1384160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1385160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1386160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1387160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1388160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1389160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            frameNumber, timestamp);
1390160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1391160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1392160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1393160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1394160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1395174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1396174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1397174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1398174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1399174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1400174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
14012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
14022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1403174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1406174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1407174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
14082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1409174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1410174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1411174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1412174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1413174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1414174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
14152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1416174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1417174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1418174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1419174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1420174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1421174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1422174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1423174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1424174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1425174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1426174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1427174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1428174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1429174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1430174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1431174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1432174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1433174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1434174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1435174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1436174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1437174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1438174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1439174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1440174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1441174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
14422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1443174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1444174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1447174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1448174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
14492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1450174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1451174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1452174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1453174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1454174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
14552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
14562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1457174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1458174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1459174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1460174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1461174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1462174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1463174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1464174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1465174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
14662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1467174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1468174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1469174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1470174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
14712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1472174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1473174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1474174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1475174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1476174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1477174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1478a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1479a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1480a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1481a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1482174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1483174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1484174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1485174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
1486a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1487a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1488a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
14898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
14908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1491174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1492603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
1493a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1494a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1495a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1496a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
14978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1498603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1499160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1500160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1501160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1502160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1503160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1504160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1505160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1506160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1507160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1508160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1509160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1510160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1511a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaint Camera2Client::getCameraId() {
1512a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mCameraId;
1513c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1514c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1515a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaconst sp<Camera2Device>& Camera2Client::getCameraDevice() {
1516a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mDevice;
1517c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1518c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1519a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1520a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1521c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1522c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1523a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1524a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mCameraClient(client.mCameraClient),
1525a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedClient(client) {
1526a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.lock();
1527c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1528c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1529a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::~Lock() {
1530a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.unlock();
15318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1533ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville TalvalaCamera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1534ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        mCameraClient(client) {
1535ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala}
1536ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
1537a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1538a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        const sp<ICameraClient>&client) {
1539a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1540a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient = client;
1541a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return *this;
1542a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}
15432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1544a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalavoid Camera2Client::SharedCameraClient::clear() {
1545a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1546a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient.clear();
15478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() {
15509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
15519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
1552228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> recordingHeap;
15539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t heapIdx = 0;
15549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    nsecs_t timestamp;
15559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    {
15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
15579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
155830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        BufferItemConsumer::BufferItem imgBuffer;
155930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        res = mRecordingConsumer->acquireBuffer(&imgBuffer);
15609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
15619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
15629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
15639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
156530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        timestamp = imgBuffer.mTimestamp;
15669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1567228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount++;
1568228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1569228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Signal errors here upstream
15712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (l.mParameters.state != Parameters::RECORD &&
15722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
1573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "recording done",
1575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
157630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
15779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1579898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
158078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        if (mRecordingHeap == 0) {
158178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            const size_t bufferSize = 4 + sizeof(buffer_handle_t);
15829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
15839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "size %d bytes", __FUNCTION__, mCameraId,
1584983cf231ab2d176a14595cdae46ff1b0c239af47James Dong                    mRecordingHeapCount, bufferSize);
15859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1586983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
15879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "Camera2Client::RecordingHeap");
15889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap->mHeap->getSize() == 0) {
15899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
15909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        __FUNCTION__, mCameraId);
159130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingConsumer->releaseBuffer(imgBuffer);
15929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
15939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
159430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
159530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                if (mRecordingBuffers[i].mBuf !=
159630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                        BufferItemConsumer::INVALID_BUFFER_SLOT) {
159730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    ALOGE("%s: Camera %d: Non-empty recording buffers list!",
159830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                            __FUNCTION__, mCameraId);
159930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                }
160030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            }
160130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.clear();
160230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.setCapacity(mRecordingHeapCount);
160330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.insertAt(0, mRecordingHeapCount);
160430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
16059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapHead = 0;
1606983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeapFree = mRecordingHeapCount;
16079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
16089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if ( mRecordingHeapFree == 0) {
16109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
16119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
161230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
16139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
16149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
16169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        heapIdx = mRecordingHeapHead;
1617983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
16189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapFree--;
16199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGV("%s: Camera %d: Timestamp %lld",
16219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, timestamp);
16229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ssize_t offset;
16249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size;
16259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        sp<IMemoryHeap> heap =
16269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
16279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        &size);
16289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
162978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
163078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint32_t type = kMetadataBufferTypeGrallocSource;
163130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((uint32_t*)data) = type;
163230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
163378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
163430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
163530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
1636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        recordingHeap = mRecordingHeap;
16379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
1638228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1639228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside locked parameters to allow re-entrancy from notification
1640a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    SharedCameraClient::Lock l(mSharedCameraClient);
1641a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    if (l.mCameraClient != 0) {
1642a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        l.mCameraClient->dataCallbackTimestamp(timestamp,
16439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                CAMERA_MSG_VIDEO_FRAME,
1644228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                recordingHeap->mBuffers[heapIdx]);
1645d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1646d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1647d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
16483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
16493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Client::updateRequests(const Parameters &params) {
16518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
16528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updatePreviewRequest(params);
16548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
16558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
16568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
16578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
16588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateCaptureRequest(params);
16608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
16618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)",
16628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
16638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
16648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateRecordingRequest(params);
16678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
16688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
16698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
16708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
16718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
16748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mPreviewRequest);
16758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
16768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
16778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
16788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
16798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
16802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
16812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
16828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mRecordingRequest);
16838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
16848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
16858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
16868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
16878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
16888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
16908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
16918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1692836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters &params) {
1693be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
1694be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
1695836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1696be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
1697be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Check if stream parameters have to change
1698be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t currentWidth, currentHeight;
1699be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->getStreamInfo(mPreviewStreamId,
1700be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &currentWidth, &currentHeight, 0);
1701be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1702be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying preview stream info: "
1703be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1704be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1705be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1706836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
1707836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight) {
17089e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
17099e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
1710836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    params.previewWidth, params.previewHeight);
1711be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->waitUntilDrained();
1712be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
1713be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
1714be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1715be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
1716be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
1717be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->deleteStream(mPreviewStreamId);
1718be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
1719be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
1720be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
1721be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        strerror(-res), res);
1722be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
1723be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
1724be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mPreviewStreamId = NO_STREAM;
1725be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1726be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1727be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1728be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
1729be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mPreviewWindow,
1730836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth, params.previewHeight,
1731be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
1732be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mPreviewStreamId);
1733be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1734be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
1735be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1736be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1737be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1738be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1739be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1740c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = mDevice->setStreamTransform(mPreviewStreamId,
1741836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.previewTransform);
1742c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
1743c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
1744c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1745c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return res;
1746c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1747c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1748be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
1749be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
1750be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1751836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters &params) {
1752a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
17536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
1754cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
17556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
17566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
17576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
17586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
17596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
17606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
17616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
17626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1763be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1764cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mPreviewRequest, params);
1765be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1766be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of preview "
1767be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
1768be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
1769be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1770be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1771be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
17726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
17736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
17746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1775836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest(const Parameters &params) {
1776d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
1777d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
1778cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
1779d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
1780d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &mCaptureRequest);
1781d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1782d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
1783d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1784d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
1785d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1786d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1787be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1788cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mCaptureRequest, params);
1789be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1790be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
1791be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
1792be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
1793be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1794be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1795be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1796cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE,
1797836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.jpegThumbSize, 2);
1798be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1799cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY,
1800836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegThumbQuality, 1);
1801be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1802cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_QUALITY,
1803836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegQuality, 1);
1804be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1805cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(
1806be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
1807836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegRotation, 1);
1808be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1809be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1810836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.gpsEnabled) {
1811cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
1812be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
1813836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.gpsCoordinates, 3);
1814be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
1815cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
1816be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
1817836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.gpsTimestamp, 1);
1818be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
1819cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
1820be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
1821cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                params.gpsProcessingMethod);
1822be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
1823be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
1824cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES);
1825be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
1826cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP);
1827be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
1828cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
1829be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
1830be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1831be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1832d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
1833d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1834d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1835836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters &params) {
18369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
18379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
1838cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
18399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
18409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &mRecordingRequest);
18419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
18429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default recording request:"
18439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
18449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
18459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
18469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
18479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1848cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mRecordingRequest, params);
18499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
18509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of recording "
18519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
18529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
18539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
18549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
18559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
18569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
18579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
18589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1859836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters &params) {
18609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
18619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
18629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingConsumer == 0) {
1863228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Create CPU buffer queue endpoint. We need one more buffer here so that we can
1864228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // always acquire and free a buffer when the heap is full; otherwise the consumer
1865228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // will have buffers in flight we'll never clear out.
186630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingConsumer = new BufferItemConsumer(
186730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                GRALLOC_USAGE_HW_VIDEO_ENCODER,
186830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingHeapCount + 1,
186930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                true);
18709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
18719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
18729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingWindow = new SurfaceTextureClient(
18739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->getProducerInterface());
18749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Allocate memory later, since we don't know buffer size until receipt
18759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
18769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
18779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
18789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Check if stream parameters have to change
18799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint32_t currentWidth, currentHeight;
18809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->getStreamInfo(mRecordingStreamId,
18819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &currentWidth, &currentHeight, 0);
18829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
18839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying recording output stream info: "
18849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
18859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
18869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1887836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.videoWidth ||
1888836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.videoHeight) {
18899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Should wait to be sure previous recording has finished
18909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = mDevice->deleteStream(mRecordingStreamId);
18919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) {
18929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
18939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
18949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        strerror(-res), res);
18959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return res;
18969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
18979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingStreamId = NO_STREAM;
18989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
18999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
19009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
19019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId == NO_STREAM) {
1902228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount = 0;
19039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createStream(mRecordingWindow,
1904836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.videoWidth, params.videoHeight,
190578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
19069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
19079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for recording: "
19089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
19099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
19109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
19119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
19129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
19139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
19149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
19159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1916cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(CameraMetadata *request,
19172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const Parameters &params) const {
1918be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
1919be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
1920cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
1921cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            params.previewFpsRange, 2);
1922be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1923be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1924836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t wbMode = params.autoWhiteBalanceLock ?
1925cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            (uint8_t)ANDROID_CONTROL_AWB_LOCKED : params.wbMode;
1926cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_MODE,
1927cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &wbMode, 1);
1928be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1929cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_EFFECT_MODE,
1930cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &params.effectMode, 1);
1931be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1932cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
1933836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.antibandingMode, 1);
1934be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1935be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1936be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t controlMode =
1937836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ?
1938be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE;
1939cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_MODE,
1940cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &controlMode, 1);
1941be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1942be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) {
1943cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_SCENE_MODE,
1944836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.sceneMode, 1);
1945be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
1946be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1947be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1948be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t flashMode = ANDROID_FLASH_OFF;
1949be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t aeMode;
1950836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.flashMode) {
1951be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
1952be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON; break;
1953be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
1954be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break;
1955be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_ON:
1956be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break;
1957be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
1958be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON;
1959be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            flashMode = ANDROID_FLASH_TORCH;
1960be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
1961be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
1962be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break;
1963be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
1964be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
1965836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.flashMode);
1966be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
1967be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1968836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED;
1969be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1970cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_FLASH_MODE,
1971cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &flashMode, 1);
1972be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1973cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_MODE,
1974cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &aeMode, 1);
1975be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1976be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1977be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float focusDistance = 0; // infinity focus in diopters
1978be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t focusMode;
1979836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.focusMode) {
1980be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
1981be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
1982be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1983be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1984be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
1985836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            focusMode = params.focusMode;
1986be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
1987be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
1988be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
1989be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            focusMode = ANDROID_CONTROL_AF_OFF;
1990be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
1991be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
1992be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
1993836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.focusMode);
1994be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
1995be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1996cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_LENS_FOCUS_DISTANCE,
1997cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &focusDistance, 1);
1998be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
1999cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_MODE,
2000cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &focusMode, 1);
2001be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2002be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2003836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t focusingAreasSize = params.focusingAreas.size() * 5;
2004be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *focusingAreas = new int32_t[focusingAreasSize];
2005be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < focusingAreasSize; i += 5) {
2006f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        if (params.focusingAreas[i].weight != 0) {
20072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 0] =
20082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedXToArray(params.focusingAreas[i].left);
20092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 1] =
20102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedYToArray(params.focusingAreas[i].top);
20112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 2] =
20122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedXToArray(params.focusingAreas[i].right);
20132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 3] =
20142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedYToArray(params.focusingAreas[i].bottom);
2015f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        } else {
2016f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 0] = 0;
2017f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 1] = 0;
2018f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 2] = 0;
2019f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 3] = 0;
2020f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        }
2021836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 4] = params.focusingAreas[i].weight;
2022be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2023cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_REGIONS,
2024cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            focusingAreas,focusingAreasSize);
2025be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2026be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] focusingAreas;
2027be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2028cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_EXP_COMPENSATION,
2029836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.exposureCompensation, 1);
2030be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2031be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2032836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t meteringAreasSize = params.meteringAreas.size() * 5;
2033be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *meteringAreas = new int32_t[meteringAreasSize];
2034be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < meteringAreasSize; i += 5) {
2035f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        if (params.meteringAreas[i].weight != 0) {
2036f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 0] =
20372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedXToArray(params.meteringAreas[i].left);
2038f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 1] =
20392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedYToArray(params.meteringAreas[i].top);
2040f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 2] =
20412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedXToArray(params.meteringAreas[i].right);
2042f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 3] =
20432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedYToArray(params.meteringAreas[i].bottom);
2044f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        } else {
2045f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 0] = 0;
2046f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 1] = 0;
2047f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 2] = 0;
2048f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 3] = 0;
2049f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        }
2050836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 4] = params.meteringAreas[i].weight;
2051be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2052cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_REGIONS,
2053cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            meteringAreas, meteringAreasSize);
2054be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2055be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2056cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_REGIONS,
2057cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            meteringAreas, meteringAreasSize);
2058be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2059be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] meteringAreas;
2060be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2061be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // Need to convert zoom index into a crop rectangle. The rectangle is
2062be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // chosen to maximize its area on the sensor
2063be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2064cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
20652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            mParameters.staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM);
2066be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
20672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (params.NUM_ZOOM_STEPS-1);
2068836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    float zoomRatio = 1 + zoomIncrement * params.zoom;
2069be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2070be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
2071836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.previewWidth >= params.previewHeight) {
20722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        zoomWidth =  params.fastInfo.arrayWidth / zoomRatio;
2073be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = zoomWidth *
2074836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewHeight / params.previewWidth;
2075be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
20762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        zoomHeight = params.fastInfo.arrayHeight / zoomRatio;
2077be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth = zoomHeight *
2078836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth / params.previewHeight;
2079be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
20802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoomLeft = (params.fastInfo.arrayWidth - zoomWidth) / 2;
20812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoomTop = (params.fastInfo.arrayHeight - zoomHeight) / 2;
2082be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2083be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
2084cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_SCALER_CROP_REGION,
2085cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            cropRegion, 3);
2086be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2087be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2088be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // TODO: Decide how to map recordingHint, or whether just to ignore it
2089be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2090836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t vstabMode = params.videoStabilization ?
2091be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_ON :
2092be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
2093cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
2094be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &vstabMode, 1);
2095be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2096be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
20978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    uint8_t faceDetectMode = params.enableFaceDetect ?
20982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.fastInfo.bestFaceDetectMode :
20998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            (uint8_t)ANDROID_STATS_FACE_DETECTION_OFF;
2100cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_STATS_FACE_DETECT_MODE,
21018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            &faceDetectMode, 1);
21028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) return res;
21038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2104be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2105be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2106be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2107228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
2108228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
2109228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
2110228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
2111228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2112228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
2113228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
2114228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
2115228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2116228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
2117228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
2118f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
2119228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
2120228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
2121228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2122228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
2123228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2124228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
2125228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
2126228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
2127228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2128228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
2129228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
2130228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
2131228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
2132228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2133228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
21348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
213561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
2136