Camera2Client.cpp revision a16733eeb9c40db4793bec408f29b4204e5f23b1
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),
552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        mParameters(cameraId, cameraFacing),
56d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId(NO_STREAM),
57228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackStreamId(NO_STREAM),
58228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapId(0),
59d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId(NO_STREAM),
609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingStreamId(NO_STREAM),
61983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapCount(kDefaultRecordingHeapCount)
62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
63a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
64c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Created client for camera %d", __FUNCTION__, cameraId);
6561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
67228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const {
733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    int callingPid = getCallingPid();
743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if (callingPid == mClientPid) return NO_ERROR;
753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    ALOGE("%s: attempt to use a locked camera from a different process"
773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    return PERMISSION_DENIED;
793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala}
803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
83a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
84c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
87c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor = new FrameProcessor(this);
88c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    String8 frameThreadName = String8::format("Camera2Client[%d]::FrameProcessor",
89c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala            mCameraId);
90c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->run(frameThreadName.string());
91c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
99174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->setNotifyCallback(this);
100174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
1022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.initialize(&(mDevice->info()));
104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
110f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
111f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
112f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
1132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGD("%s", l.mParameters.paramsFlattened.string());
114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
11761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
11861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
120a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
121c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Camera %d: Shutting down client.", __FUNCTION__, mCameraId);
1224ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
123f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1253a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    // Rewrite mClientPid to allow shutdown by CameraService
1263a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mClientPid = getCallingPid();
127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
128c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
129c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->requestExit();
130c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Camera %d: Shutdown complete", __FUNCTION__, mCameraId);
13161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
134611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
136611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
137611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
138611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
143836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
148836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
150836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
152836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
15311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
156836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
158836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
160836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
161836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
163836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
164836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
166836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
167836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
169836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
171836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
175836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
211836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
233836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
244836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
257836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
259836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
260836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
261836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
262836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
263836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
267836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
270836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
271836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
274836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
276836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
277836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
278836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
279836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
280836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
283836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
284836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
285836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
291836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
2927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n", mPreviewStreamId);
2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n", mCaptureStreamId);
296836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n", mRecordingStreamId);
2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current requests:\n");
299cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() != 0) {
3003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request:\n");
3013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
302cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mPreviewRequest.dump(fd, 2, 6);
3033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
3043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request: undefined\n");
3053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
308cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() != 0) {
3093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request:\n";
3103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
311cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mCaptureRequest.dump(fd, 2, 6);
3123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
3133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request: undefined\n";
3143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
317cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() != 0) {
318428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request:\n";
319428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
320cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mRecordingRequest.dump(fd, 2, 6);
321428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    } else {
322428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request: undefined\n";
323428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
324428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    }
325428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
326c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
327c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
3283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
329611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
3307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
3323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
3333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
3343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
3353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
339611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
34061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
34161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
34361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
345a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3469e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
347ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
3483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
3493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
350ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
351f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
352f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
35336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
3546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
355d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
357d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId = NO_STREAM;
358d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
359d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
360d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
361d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mDevice->deleteStream(mCaptureStreamId);
362d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId = NO_STREAM;
3636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
364f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
365898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
366898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mDevice->deleteStream(mRecordingStreamId);
367898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mRecordingStreamId = NO_STREAM;
368898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    }
369898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
370228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackStreamId != NO_STREAM) {
371228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mDevice->deleteStream(mCallbackStreamId);
372228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackStreamId = NO_STREAM;
373228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
374228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
3772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
3788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
37961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
38061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
383a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3849e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
385ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
386ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
3879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
3889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
3899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
3909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
3919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
3929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
3939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
3958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
3969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = client;
397a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedCameraClient = client;
3989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::STOPPED;
401228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
4029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
40361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
40461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
40561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
406a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4079e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
408ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
411ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
42461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
42561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
42661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
427a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4289e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
429ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
432ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Check for uninterruptable conditions
4349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
438a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedCameraClient.clear();
4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
44561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
449a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4509e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
451ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4523a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4533a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
454ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
4586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
46236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder,window);
46361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
46461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
4666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
467a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4689e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
469ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4703a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4713a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
472ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
4766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
4776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
47936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
48236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
483be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
484a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
4889e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
4899e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
4906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
4916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
4962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
4999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
5099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Optimize this so that we don't wait for old stream to drain
5109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // before spinning up new stream
511cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
516d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->waitUntilDrained();
518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
521be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
525be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
526be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
5276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
5286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
529be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        mPreviewStreamId = NO_STREAM;
5306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
532bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
533be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mPreviewWindow = window;
534bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
54061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
54161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
54261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
543a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
544228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
545ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
547228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
548228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
551228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
552228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
553228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
554228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
555228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
556228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
557228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
558228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
559228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
560228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
561228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        switch(params.state) {
5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
563228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
564228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
567228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startRecordingL(params, true);
568228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
569228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
572228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
576228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
577228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
57961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
58061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
58161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
582a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5839e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
584ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5853a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5863a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
589d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
590ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
592d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
5936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state >= Parameters::PREVIEW && !restart) {
5954ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
5984ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
5994ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
6006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
601be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewWindow == 0) {
6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
6036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
6046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
6069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updatePreviewStream(params);
608be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
609be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
610be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
611be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
6126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
613228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateCallbackStream(params);
617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
619228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
620228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
621228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
622228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
6236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
624cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
625228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updatePreviewRequest(params);
626be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
627be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
628be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
630be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
6316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[2] =
635228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                { mPreviewStreamId, mCallbackStreamId };
636cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mPreviewRequest.update(
637228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
638228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 2);
639228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else {
640cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        uint8_t outputStreams[1] = { mPreviewStreamId };
641cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mPreviewRequest.update(
642228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
643cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                outputStreams, 1);
644228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
6456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
6466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
6476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
650cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mPreviewRequest.sort();
651be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
652be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
653be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
6586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
659bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
660bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
6616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
6656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
66761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
66861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
66961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
670a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6719e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
672ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
67536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
676ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
677ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
67836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
679ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
681228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
684228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
685228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
686228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
688d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
689d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
690d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
6912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
692d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
6932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
694d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
695d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
696d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
6972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
698228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break - identical to preview
6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
700cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
7012267106c98f461b730c772a913da946c391a178cEino-Ville Talvala            mDevice->waitUntilDrained();
702228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
707d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
708228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
709d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
710d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
711228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
712d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
71361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
71461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
71561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
716a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
717ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7193a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
7203a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
72361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
72461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
72561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
726a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
727ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7283a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7293a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7303a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
73578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
73878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
73978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
74078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
74178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
74278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
74378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
74578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
74678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
74761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
74861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
74961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
750a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7519e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
752ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
7543a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
756228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
758228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
7593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
760228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
761228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
762228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
764228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
7659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
7669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
7689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
7699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
772228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
773228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
774228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
7759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
7779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
7809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
7819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
7829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
783228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
78478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
78578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
78678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
78778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
78878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
78978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
790228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updateRecordingStream(params);
7919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
7939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
796228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
797228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
798228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
799228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateCallbackStream(params);
800228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
801228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
802228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
803228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
804228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
805228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
807cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRecordingRequest(params);
8099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
8109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
8119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
8139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
8149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
816228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[3] =
818228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                { mPreviewStreamId, mRecordingStreamId, mCallbackStreamId };
819cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
820228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
821228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 3);
822228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else {
823228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId };
824cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
825228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 2);
827228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
8309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
833cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mRecordingRequest.sort();
8349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
8369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mRecordingRequest);
8419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set recording request to start "
8439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "recording: %s (%d)", __FUNCTION__, mCameraId,
8449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
8459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
8482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
849228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
85261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
85361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
85461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
855a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8569e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
857ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
859228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
8613a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
8623a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
8632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
8669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
8692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
8719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
8729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
8732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
8742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
8759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
8769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
8779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Back to preview. Since record can only be reached through preview,
8799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // all preview stream setup should be up to date.
8809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
8819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to switch back to preview request: "
8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
8849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
8859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Should recording heap be freed? Can't do it yet since requests
8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // could still be in flight.
8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::PREVIEW;
89161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
89261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
89361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
894a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
895ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8968da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
8973a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
8983a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
8998da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
9008da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
9018da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9028da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
9038da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
9042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9058da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
9072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
90861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
90961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
91061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
911a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
912ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
91530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
91730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Make sure this is for the current heap
9199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ssize_t offset;
9209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t size;
9219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
9229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
9239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
9249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "(got %x, expected %x)", __FUNCTION__, mCameraId,
9259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
9269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
9279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
92878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint8_t *data = (uint8_t*)heap->getBase() + offset;
92978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint32_t type = *(uint32_t*)data;
93078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (type != kMetadataBufferTypeGrallocSource) {
93178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
93278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
93378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
93478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
93530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
93630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    // Release the buffer back to the recording queue
93730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
93830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
93930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
94030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    size_t itemIndex;
94130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
94230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
94330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
94430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                item.mGraphicBuffer->handle == imgHandle) {
94530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            break;
94630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        }
94730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
94830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    if (itemIndex == mRecordingBuffers.size()) {
94930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
95030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
95130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        return;
95230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
95330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
95478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
95530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            imgHandle);
95630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
95730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
95878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (res != OK) {
95978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
96078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "%s (%d)",
96130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
96278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
96378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
96430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    mRecordingBuffers.replaceAt(itemIndex);
96578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
9669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mRecordingHeapFree++;
96761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
96861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
96961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
970a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
971ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
975174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
976174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
9772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
9782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
9792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
980174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
981174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
982174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
983174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
9846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
98561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
98661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
98761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
988a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
989ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9913a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9923a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
993174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
994174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
9952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
997174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
998174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
999174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1000174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
100261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
100361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
100461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
1005a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1006ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1007d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
10083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1009d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
10112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
10132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
10142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1015d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1016d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1017d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
10182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
10192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
1020d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
1021d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
10222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
10232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
1024d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
1025d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1026d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1027d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1028d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1030d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateCaptureStream(l.mParameters);
1032228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (res != OK) {
1033228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1034228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1035228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return res;
1036228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
10378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1038cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
10392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        res = updateCaptureRequest(l.mParameters);
10404ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        if (res != OK) {
1041228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't create still image capture request: "
1042228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
10434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return res;
10444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
1045d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1046d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    bool callbacksEnabled = l.mParameters.previewCallbackFlags &
1048228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
10492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    bool recordingEnabled = (l.mParameters.state == Parameters::RECORD);
1050228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1051228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    int streamSwitch = (callbacksEnabled ? 0x2 : 0x0) +
1052228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            (recordingEnabled ? 0x1 : 0x0);
1053228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch ( streamSwitch ) {
1054228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 0: { // No recording, callbacks
1055228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
1056cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1057cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 2);
1058228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1059228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1060228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 1: { // Recording
1061228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId,
1062228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                     mCaptureStreamId };
1063cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1064cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 3);
1065228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1066228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1067228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 2: { // Callbacks
1068228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[3] = { mPreviewStreamId, mCallbackStreamId,
1069228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                     mCaptureStreamId };
1070cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1071cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 3);
1072228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1073228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1074228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 3: { // Both
1075228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[4] = { mPreviewStreamId, mCallbackStreamId,
1076228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                     mRecordingStreamId, mCaptureStreamId };
1077cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1078cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 4);
1079228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1080228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1081228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    };
1082d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1083d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
1084d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
1085d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1086d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
1087d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1088cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.sort();
1089be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1090be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)",
1091be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1092be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1093be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1094d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1095cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
1096cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
1097d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
1098d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
1099d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return NO_MEMORY;
1100d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1101d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
11022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state == Parameters::PREVIEW) {
1103cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mDevice->clearStreamingRequest();
1104d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1105d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
1106d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)",
1107d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1108d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
1109d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1110d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
11119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
1112d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = mDevice->capture(captureCopy);
1113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
1115d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
1116d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1117d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
1118d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1119d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
11202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
11212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
11222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STILL_CAPTURE;
11232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            res = commandStopFaceDetectionL(l.mParameters);
11248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            if (res != OK) {
11258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
11268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                        __FUNCTION__, mCameraId);
11278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                return res;
11288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
1129d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
11302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
11312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1132d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
1133d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
1134d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state for still capture!",
1135d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1136d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1137d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1138d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1139d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
114061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
114161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
114261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1143a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11449e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1145ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
11473a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
11522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
11539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
11558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
115761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1158f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
115961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1160a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1161ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11623a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1163ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1165ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
11672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.paramsFlattened;
116861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
116961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
117061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1171a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1172ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
11743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1175c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1176c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1177c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1178c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
117936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
118036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
118136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
118236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
118336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
118436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
118536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
118636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
118736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
118836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
118936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
119036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
119136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1192228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
11932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
11942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1195228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
119636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
119736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
119836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
119936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
120036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
120136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
120236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
120336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
120436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1205c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
120636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
120736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
120836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
120936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
121036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
121136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
121236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
121336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
121436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
121536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
121636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
121736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
121836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
121936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
12202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
122136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
122236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
122336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
122436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
122536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
122636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
12272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
122936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mPreviewStreamId != NO_STREAM) {
123036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mDevice->setStreamTransform(mPreviewStreamId, transform);
123136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
12322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
123336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
123436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
123536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
123636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
12372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
123836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
12392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1240c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
124136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1242983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
124336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
124436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
124536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
124636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
124736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
124836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
124936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
125036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
125136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
125236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
125336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1254983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
125536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1256983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
125836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
125936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1260983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
126136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
126236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
126336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
126436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
126536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
126636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartFaceDetectionL(int type) {
12678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
12688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
12702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
12732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
12742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
12768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
12778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
12788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
12792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
12802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
12828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
12838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
12848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_STATS_FACE_DETECTION_OFF) {
12888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
12898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
12908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return INVALID_OPERATION;
12918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
12938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
12958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
12978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
129936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
130036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1301228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
13028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
13038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
13048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
13058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1306228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
13078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1308228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
13098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1313228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
13148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
13158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
131736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
131836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
131936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1322174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
132336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
132436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
132536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
132636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
132736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
13282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1330983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
133136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
133236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
133336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
133436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
133536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
133636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
13378da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
133836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
133936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
134036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1341c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1342c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
134336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // 32 is the current upper limit on the video buffer count for BufferQueue
134436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (count > 32) {
134536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
134636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, count);
134736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
134836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
134936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
135036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Need to reallocate memory for heap
135136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (mRecordingHeapCount != count) {
135236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if  (mRecordingHeap != 0) {
135336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap.clear();
135436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap = NULL;
135536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        }
135636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mRecordingHeapCount = count;
135736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1358c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
13596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
136061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
136161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
13633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1364160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1365160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1366160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1367160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1368160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1369160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1370160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            frameNumber, timestamp);
1371160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1372160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1373160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1374160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1375160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1376174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1377174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1380174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
13822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
13832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1384174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1385174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1386174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1387174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1388174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
13892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1390174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1391174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1392174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1393174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1394174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1395174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
13962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1397174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1398174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1399174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1400174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1401174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1402174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1403174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1406174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1407174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1408174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1409174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1410174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1411174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1412174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1413174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1414174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1415174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1416174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1417174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1418174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1419174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1420174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1421174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1422174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
14232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1424174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1425174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
14262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
14272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1428174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1429174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
14302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1431174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1432174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1433174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1434174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1435174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1438174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1439174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1440174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1441174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1442174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1443174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1444174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1445174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1446174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
14472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1448174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1449174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1450174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1451174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
14522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1453174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1454174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1455174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1456174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1457174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1458174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1459a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1460a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1461a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1462a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1463174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1464174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1465174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1466174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
1467a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1468a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1469a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
14708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
14718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1472174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1473603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
1474a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1475a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1476a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1477a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
14788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1479603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1480160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1481160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1482160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1483160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1484160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1485160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1486160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1487160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1488160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1489160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1490160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1491160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1492a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaint Camera2Client::getCameraId() {
1493a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mCameraId;
1494c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1495c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1496a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaconst sp<Camera2Device>& Camera2Client::getCameraDevice() {
1497a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mDevice;
1498c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1499c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1500a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1501a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1502c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1503c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1504a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1505a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mCameraClient(client.mCameraClient),
1506a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedClient(client) {
1507a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.lock();
1508c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1509c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1510a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::~Lock() {
1511a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.unlock();
15128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1514a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1515a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        const sp<ICameraClient>&client) {
1516a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1517a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient = client;
1518a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return *this;
1519a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}
15202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1521a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalavoid Camera2Client::SharedCameraClient::clear() {
1522a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1523a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient.clear();
15248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1526228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::onCallbackAvailable() {
1527d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
1528d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
1529228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Preview callback available", __FUNCTION__, mCameraId);
1530228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1531228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    int callbackHeapId;
1532228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> callbackHeap;
1533228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    size_t heapIdx;
15349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1535d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    CpuConsumer::LockedBuffer imgBuffer;
1536228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Getting buffer", __FUNCTION__);
1537228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = mCallbackConsumer->lockNextBuffer(&imgBuffer);
1538228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (res != OK) {
1539228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGE("%s: Camera %d: Error receiving next callback buffer: "
1540228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1541228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return;
1542228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1543228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1544d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    {
15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
1546d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
15472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if ( l.mParameters.state != Parameters::PREVIEW
15482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                && l.mParameters.state != Parameters::RECORD
15492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                && l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
1550228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: No longer streaming",
1551228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1552228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
1553228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
1554228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1555228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (! (l.mParameters.previewCallbackFlags &
1557228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ) {
1558228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: No longer enabled, dropping", __FUNCTION__);
1559228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
1560228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
1561228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if ((l.mParameters.previewCallbackFlags &
1563228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) &&
15642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                !l.mParameters.previewCallbackOneShot) {
1565228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: One shot mode, already sent, dropping", __FUNCTION__);
1566228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
1567228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
1568228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1569228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (imgBuffer.format != l.mParameters.previewFormat) {
1571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for callback: "
1572228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    imgBuffer.format, l.mParameters.previewFormat);
1574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
1575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
1576228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1577228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        size_t bufferSize = calculateBufferSize(imgBuffer.width, imgBuffer.height,
1579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                imgBuffer.format, imgBuffer.stride);
1580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        size_t currentBufferSize = (mCallbackHeap == 0) ?
1581228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                0 : (mCallbackHeap->mHeap->getSize() / kCallbackHeapCount);
1582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (bufferSize != currentBufferSize) {
1583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeap.clear();
1584228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeap = new Camera2Heap(bufferSize, kCallbackHeapCount,
1585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "Camera2Client::CallbackHeap");
1586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (mCallbackHeap->mHeap->getSize() == 0) {
1587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for callbacks",
1588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        __FUNCTION__, mCameraId);
1589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                mCallbackConsumer->unlockBuffer(imgBuffer);
1590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                return;
1591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
1592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeapHead = 0;
1594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeapFree = kCallbackHeapCount;
1595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeapId++;
1596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (mCallbackHeapFree == 0) {
1599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: No free callback buffers, dropping frame",
1600d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1601228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
1602d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1603d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1604228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        heapIdx = mCallbackHeapHead;
1605228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        callbackHeap = mCallbackHeap;
1606228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        callbackHeapId = mCallbackHeapId;
1607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapHead = (mCallbackHeapHead + 1) & kCallbackHeapCount;
1609228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapFree--;
1610228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1611228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Get rid of this memcpy by passing the gralloc queue all the way
1612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // to app
1613228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ssize_t offset;
1615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        size_t size;
1616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        sp<IMemoryHeap> heap =
1617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeap->mBuffers[heapIdx]->getMemory(&offset,
1618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    &size);
1619228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
1620228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        memcpy(data, imgBuffer.data, bufferSize);
1621228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1622228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: Freeing buffer", __FUNCTION__);
1623228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer->unlockBuffer(imgBuffer);
1624228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1625228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // In one-shot mode, stop sending callbacks after the first one
16262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (l.mParameters.previewCallbackFlags &
1627228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
1628228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: clearing oneshot", __FUNCTION__);
16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.previewCallbackOneShot = false;
1630228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1631228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1632228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside parameter lock to allow re-entrancy from notification
1634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
1635a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1636a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1637228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: Invoking client data callback",
1638228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1639a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_FRAME,
1640228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    callbackHeap->mBuffers[heapIdx], NULL);
1641228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1642228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1643228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
16442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
1645228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Only increment free if we're still using the same heap
1646228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackHeapId == callbackHeapId) {
1647228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapFree++;
1648228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1649228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1650228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: exit", __FUNCTION__);
1651228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
1652228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1653228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() {
1654228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ATRACE_CALL();
1655228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
1656228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> captureHeap;
1657228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId);
1658228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1659228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
16602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
1661228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CpuConsumer::LockedBuffer imgBuffer;
1662d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1663d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1664d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1665d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1666d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1667d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1668d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1669d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1670228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Signal errors here upstream
16712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (l.mParameters.state != Parameters::STILL_CAPTURE &&
16722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
1673228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1674228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1675228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
1676228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
1677228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1678228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1679d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1680d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for still image: "
1681d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
1682d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    imgBuffer.format,
1683d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    HAL_PIXEL_FORMAT_BLOB);
1684d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
1685d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1686d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1687d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1688d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Optimize this to avoid memcopy
16899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        void* captureMemory = mCaptureHeap->mHeap->getBase();
16909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size = mCaptureHeap->mHeap->getSize();
1691d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        memcpy(captureMemory, imgBuffer.data, size);
1692d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1693d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->unlockBuffer(imgBuffer);
1694d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
16952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.state) {
16962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case Parameters::STILL_CAPTURE:
16972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state = Parameters::STOPPED;
1698d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
16992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
17002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state = Parameters::RECORD;
1701d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1702d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            default:
1703d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
17042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        mCameraId, l.mParameters.state);
1705d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1706d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
17078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1708228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        captureHeap = mCaptureHeap;
1709d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1710228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside parameter locks to allow re-entrancy from notification
1711a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    SharedCameraClient::Lock l(mSharedCameraClient);
1712a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    if (l.mCameraClient != 0) {
1713a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        l.mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
1714228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                captureHeap->mBuffers[0], NULL);
17159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
17169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
17179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
17189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() {
17199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
17209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
1721228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> recordingHeap;
17229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t heapIdx = 0;
17239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    nsecs_t timestamp;
17249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    {
17252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
17269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
172730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        BufferItemConsumer::BufferItem imgBuffer;
172830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        res = mRecordingConsumer->acquireBuffer(&imgBuffer);
17299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
17309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
17319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
17329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
17339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
173430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        timestamp = imgBuffer.mTimestamp;
17359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1736228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount++;
1737228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1738228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1739228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Signal errors here upstream
17402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (l.mParameters.state != Parameters::RECORD &&
17412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
1742228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1743228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "recording done",
1744228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
174530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
17469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
17479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1748898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
174978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        if (mRecordingHeap == 0) {
175078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            const size_t bufferSize = 4 + sizeof(buffer_handle_t);
17519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
17529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "size %d bytes", __FUNCTION__, mCameraId,
1753983cf231ab2d176a14595cdae46ff1b0c239af47James Dong                    mRecordingHeapCount, bufferSize);
17549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1755983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
17569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "Camera2Client::RecordingHeap");
17579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap->mHeap->getSize() == 0) {
17589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
17599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        __FUNCTION__, mCameraId);
176030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingConsumer->releaseBuffer(imgBuffer);
17619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
17629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
176330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
176430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                if (mRecordingBuffers[i].mBuf !=
176530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                        BufferItemConsumer::INVALID_BUFFER_SLOT) {
176630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    ALOGE("%s: Camera %d: Non-empty recording buffers list!",
176730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                            __FUNCTION__, mCameraId);
176830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                }
176930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            }
177030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.clear();
177130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.setCapacity(mRecordingHeapCount);
177230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.insertAt(0, mRecordingHeapCount);
177330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
17749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapHead = 0;
1775983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeapFree = mRecordingHeapCount;
17769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
17779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
17789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if ( mRecordingHeapFree == 0) {
17799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
17809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
178130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
17829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
17839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1784228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
17859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        heapIdx = mRecordingHeapHead;
1786983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
17879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapFree--;
17889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
17899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGV("%s: Camera %d: Timestamp %lld",
17909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, timestamp);
17919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
17929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ssize_t offset;
17939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size;
17949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        sp<IMemoryHeap> heap =
17959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
17969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        &size);
17979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
179878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
179978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint32_t type = kMetadataBufferTypeGrallocSource;
180030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((uint32_t*)data) = type;
180130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
180278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
180330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
180430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
1805228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        recordingHeap = mRecordingHeap;
18069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
1807228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside locked parameters to allow re-entrancy from notification
1809a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    SharedCameraClient::Lock l(mSharedCameraClient);
1810a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    if (l.mCameraClient != 0) {
1811a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        l.mCameraClient->dataCallbackTimestamp(timestamp,
18129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                CAMERA_MSG_VIDEO_FRAME,
1813228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                recordingHeap->mBuffers[heapIdx]);
1814d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1815d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1816d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
18173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
18183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
18198ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Client::updateRequests(const Parameters &params) {
18208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
18218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
18228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updatePreviewRequest(params);
18238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
18248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
18258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
18268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
18278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
18288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateCaptureRequest(params);
18298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
18308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)",
18318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
18328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
18338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
18348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
18358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateRecordingRequest(params);
18368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
18378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
18388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
18398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
18408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
18418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
18422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
18438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mPreviewRequest);
18448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
18458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
18468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
18478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
18488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
18492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
18502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
18518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mRecordingRequest);
18528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
18538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
18548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
18558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
18568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
18578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
18588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
18598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
18608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1861836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters &params) {
1862be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
1863be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
1864836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1865be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
1866be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Check if stream parameters have to change
1867be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t currentWidth, currentHeight;
1868be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->getStreamInfo(mPreviewStreamId,
1869be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &currentWidth, &currentHeight, 0);
1870be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1871be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying preview stream info: "
1872be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1873be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1874be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1875836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
1876836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight) {
18779e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
18789e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
1879836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    params.previewWidth, params.previewHeight);
1880be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->waitUntilDrained();
1881be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
1882be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
1883be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1884be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
1885be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
1886be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->deleteStream(mPreviewStreamId);
1887be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
1888be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
1889be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
1890be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        strerror(-res), res);
1891be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
1892be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
1893be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mPreviewStreamId = NO_STREAM;
1894be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1895be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1896be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1897be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
1898be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mPreviewWindow,
1899836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth, params.previewHeight,
1900be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
1901be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mPreviewStreamId);
1902be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1903be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
1904be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1905be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1906be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1907be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1908be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1909c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = mDevice->setStreamTransform(mPreviewStreamId,
1910836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.previewTransform);
1911c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
1912c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
1913c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1914c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return res;
1915c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1916c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1917be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
1918be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
1919be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1920836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters &params) {
1921a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
19226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
1923cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
19246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
19256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
19266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
19276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
19286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
19296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
19306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
19316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1932be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1933cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mPreviewRequest, params);
1934be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1935be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of preview "
1936be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
1937be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
1938be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1939be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1940be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
19416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
19426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
19436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1944228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::updateCallbackStream(const Parameters &params) {
1945228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
1946228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1947228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackConsumer == 0) {
1948228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Create CPU buffer queue endpoint
1949228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer = new CpuConsumer(kCallbackHeapCount);
1950228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackWaiter = new CallbackWaiter(this);
1951228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer->setFrameAvailableListener(mCallbackWaiter);
1952228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer->setName(String8("Camera2Client::CallbackConsumer"));
1953228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackWindow = new SurfaceTextureClient(
1954228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->getProducerInterface());
1955228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1956228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1957228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackStreamId != NO_STREAM) {
1958228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Check if stream parameters have to change
1959228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint32_t currentWidth, currentHeight, currentFormat;
1960228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = mDevice->getStreamInfo(mCallbackStreamId,
1961228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                &currentWidth, &currentHeight, &currentFormat);
1962228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
1963228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying callback output stream info: "
1964228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1965228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
1966228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1967228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
1968228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight ||
1969228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                currentFormat != (uint32_t)params.previewFormat) {
1970228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // Since size should only change while preview is not running,
1971228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // assuming that all existing use of old callback stream is
1972228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // completed.
1973228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = mDevice->deleteStream(mCallbackStreamId);
1974228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (res != OK) {
1975228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
1976228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        "for callbacks: %s (%d)", __FUNCTION__, mCameraId,
1977228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        strerror(-res), res);
1978228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                return res;
1979228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
1980228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackStreamId = NO_STREAM;
1981228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1982228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1983228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1984228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackStreamId == NO_STREAM) {
1985228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("Creating callback stream: %d %d format 0x%x",
1986228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewWidth, params.previewHeight,
1987228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewFormat);
1988228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = mDevice->createStream(mCallbackWindow,
1989228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewWidth, params.previewHeight,
1990228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewFormat, 0, &mCallbackStreamId);
1991228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
1992228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for callbacks: "
1993228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1994228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
1995228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1996228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1997228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1998228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    return OK;
1999228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
2000228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2001228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2002836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureStream(const Parameters &params) {
2003be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2004d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2005d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Find out buffer size for JPEG
2006cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t maxJpegSize =
20072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            mParameters.staticInfo(ANDROID_JPEG_MAX_SIZE);
2008d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (maxJpegSize.count == 0) {
2009d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
2010d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
2011d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return INVALID_OPERATION;
2012d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2013d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2014d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureConsumer == 0) {
2015d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create CPU buffer queue endpoint
2016d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer = new CpuConsumer(1);
2017d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
2018d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
2019d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureWindow = new SurfaceTextureClient(
2020d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->getProducerInterface());
2021d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create memory for API consumption
20229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1,
20239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                       "Camera2Client::CaptureHeap");
20249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (mCaptureHeap->mHeap->getSize() == 0) {
2025d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to allocate memory for capture",
2026d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2027d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return NO_MEMORY;
2028d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2029d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2030d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2031be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
2032d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Check if stream parameters have to change
2033d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t currentWidth, currentHeight;
2034d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->getStreamInfo(mCaptureStreamId,
2035d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &currentWidth, &currentHeight, 0);
2036d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2037d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying capture output stream info: "
2038d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2039d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2040d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2041836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.pictureWidth ||
2042836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.pictureHeight) {
2043d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            res = mDevice->deleteStream(mCaptureStreamId);
2044d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (res != OK) {
2045d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2046d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        "for capture: %s (%d)", __FUNCTION__, mCameraId,
2047d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        strerror(-res), res);
2048d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                return res;
2049d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
2050d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureStreamId = NO_STREAM;
2051d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2052d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2053be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2054be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId == NO_STREAM) {
2055be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Create stream for HAL production
2056be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mCaptureWindow,
2057836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.pictureWidth, params.pictureHeight,
2058be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
2059be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mCaptureStreamId);
2060be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2061be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for capture: "
2062be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2063be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2064be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2065be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2066be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2067d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2068d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2069be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2070836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest(const Parameters &params) {
2071d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
2072d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2073cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
2074d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2075d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &mCaptureRequest);
2076d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2077d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
2078d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2079d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2080d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2081d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2082be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2083cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mCaptureRequest, params);
2084be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2085be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
2086be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2087be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2088be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2089be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2090be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2091cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE,
2092836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.jpegThumbSize, 2);
2093be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2094cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY,
2095836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegThumbQuality, 1);
2096be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2097cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_QUALITY,
2098836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegQuality, 1);
2099be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2100cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(
2101be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
2102836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegRotation, 1);
2103be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2104be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2105836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.gpsEnabled) {
2106cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
2107be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
2108836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.gpsCoordinates, 3);
2109be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2110cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
2111be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
2112836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.gpsTimestamp, 1);
2113be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2114cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
2115be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
2116cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                params.gpsProcessingMethod);
2117be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2118be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
2119cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES);
2120be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2121cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP);
2122be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2123cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
2124be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2125be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2126be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2127d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2128d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2129d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2130836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters &params) {
21319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
21329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
2133cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
21349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
21359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &mRecordingRequest);
21369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
21379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default recording request:"
21389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
21399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
21409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
21419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
21429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2143cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mRecordingRequest, params);
21449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
21459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of recording "
21469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
21479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
21489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
21499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
21509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
21519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
21529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
21539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters &params) {
21559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
21569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
21579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingConsumer == 0) {
2158228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Create CPU buffer queue endpoint. We need one more buffer here so that we can
2159228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // always acquire and free a buffer when the heap is full; otherwise the consumer
2160228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // will have buffers in flight we'll never clear out.
216130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingConsumer = new BufferItemConsumer(
216230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                GRALLOC_USAGE_HW_VIDEO_ENCODER,
216330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingHeapCount + 1,
216430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                true);
21659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
21669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
21679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingWindow = new SurfaceTextureClient(
21689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->getProducerInterface());
21699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Allocate memory later, since we don't know buffer size until receipt
21709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
21719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
21729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
21739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Check if stream parameters have to change
21749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint32_t currentWidth, currentHeight;
21759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->getStreamInfo(mRecordingStreamId,
21769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &currentWidth, &currentHeight, 0);
21779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
21789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying recording output stream info: "
21799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
21809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
21819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
2182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.videoWidth ||
2183836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.videoHeight) {
21849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Should wait to be sure previous recording has finished
21859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = mDevice->deleteStream(mRecordingStreamId);
21869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) {
21879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
21889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
21899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        strerror(-res), res);
21909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return res;
21919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
21929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingStreamId = NO_STREAM;
21939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
21949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
21959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
21969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId == NO_STREAM) {
2197228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount = 0;
21989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createStream(mRecordingWindow,
2199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.videoWidth, params.videoHeight,
220078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
22019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
22029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for recording: "
22039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
22049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
22059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
22069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
22079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
22089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
22099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
22109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2211cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(CameraMetadata *request,
22122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const Parameters &params) const {
2213be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2214be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2215cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
2216cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            params.previewFpsRange, 2);
2217be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2218be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2219836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t wbMode = params.autoWhiteBalanceLock ?
2220cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            (uint8_t)ANDROID_CONTROL_AWB_LOCKED : params.wbMode;
2221cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_MODE,
2222cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &wbMode, 1);
2223be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2224cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_EFFECT_MODE,
2225cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &params.effectMode, 1);
2226be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2227cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
2228836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.antibandingMode, 1);
2229be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2230be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2231be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t controlMode =
2232836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ?
2233be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE;
2234cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_MODE,
2235cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &controlMode, 1);
2236be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2237be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) {
2238cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_SCENE_MODE,
2239836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.sceneMode, 1);
2240be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2241be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2242be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2243be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t flashMode = ANDROID_FLASH_OFF;
2244be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t aeMode;
2245836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.flashMode) {
2246be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
2247be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON; break;
2248be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
2249be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break;
2250be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_ON:
2251be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break;
2252be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
2253be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON;
2254be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            flashMode = ANDROID_FLASH_TORCH;
2255be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2256be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
2257be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break;
2258be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
2259be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
2260836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.flashMode);
2261be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
2262be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2263836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED;
2264be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2265cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_FLASH_MODE,
2266cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &flashMode, 1);
2267be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2268cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_MODE,
2269cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &aeMode, 1);
2270be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2271be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2272be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float focusDistance = 0; // infinity focus in diopters
2273be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t focusMode;
2274836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.focusMode) {
2275be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
2276be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
2277be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
2278be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
2279be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
2280836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            focusMode = params.focusMode;
2281be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2282be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
2283be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
2284be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            focusMode = ANDROID_CONTROL_AF_OFF;
2285be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2286be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
2287be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
2288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.focusMode);
2289be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
2290be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2291cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_LENS_FOCUS_DISTANCE,
2292cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &focusDistance, 1);
2293be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2294cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_MODE,
2295cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &focusMode, 1);
2296be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2297be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2298836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t focusingAreasSize = params.focusingAreas.size() * 5;
2299be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *focusingAreas = new int32_t[focusingAreasSize];
2300be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < focusingAreasSize; i += 5) {
2301f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        if (params.focusingAreas[i].weight != 0) {
23022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 0] =
23032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedXToArray(params.focusingAreas[i].left);
23042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 1] =
23052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedYToArray(params.focusingAreas[i].top);
23062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 2] =
23072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedXToArray(params.focusingAreas[i].right);
23082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 3] =
23092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedYToArray(params.focusingAreas[i].bottom);
2310f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        } else {
2311f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 0] = 0;
2312f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 1] = 0;
2313f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 2] = 0;
2314f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 3] = 0;
2315f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        }
2316836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 4] = params.focusingAreas[i].weight;
2317be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2318cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_REGIONS,
2319cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            focusingAreas,focusingAreasSize);
2320be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2321be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] focusingAreas;
2322be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2323cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_EXP_COMPENSATION,
2324836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.exposureCompensation, 1);
2325be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2326be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2327836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t meteringAreasSize = params.meteringAreas.size() * 5;
2328be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *meteringAreas = new int32_t[meteringAreasSize];
2329be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < meteringAreasSize; i += 5) {
2330f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        if (params.meteringAreas[i].weight != 0) {
2331f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 0] =
23322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedXToArray(params.meteringAreas[i].left);
2333f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 1] =
23342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedYToArray(params.meteringAreas[i].top);
2335f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 2] =
23362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedXToArray(params.meteringAreas[i].right);
2337f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 3] =
23382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedYToArray(params.meteringAreas[i].bottom);
2339f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        } else {
2340f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 0] = 0;
2341f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 1] = 0;
2342f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 2] = 0;
2343f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 3] = 0;
2344f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        }
2345836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 4] = params.meteringAreas[i].weight;
2346be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2347cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_REGIONS,
2348cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            meteringAreas, meteringAreasSize);
2349be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2350be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2351cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_REGIONS,
2352cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            meteringAreas, meteringAreasSize);
2353be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2354be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] meteringAreas;
2355be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2356be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // Need to convert zoom index into a crop rectangle. The rectangle is
2357be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // chosen to maximize its area on the sensor
2358be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2359cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
23602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            mParameters.staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM);
2361be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
23622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (params.NUM_ZOOM_STEPS-1);
2363836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    float zoomRatio = 1 + zoomIncrement * params.zoom;
2364be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2365be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
2366836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.previewWidth >= params.previewHeight) {
23672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        zoomWidth =  params.fastInfo.arrayWidth / zoomRatio;
2368be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = zoomWidth *
2369836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewHeight / params.previewWidth;
2370be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
23712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        zoomHeight = params.fastInfo.arrayHeight / zoomRatio;
2372be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth = zoomHeight *
2373836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth / params.previewHeight;
2374be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
23752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoomLeft = (params.fastInfo.arrayWidth - zoomWidth) / 2;
23762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoomTop = (params.fastInfo.arrayHeight - zoomHeight) / 2;
2377be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2378be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
2379cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_SCALER_CROP_REGION,
2380cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            cropRegion, 3);
2381be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2382be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2383be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // TODO: Decide how to map recordingHint, or whether just to ignore it
2384be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2385836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t vstabMode = params.videoStabilization ?
2386be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_ON :
2387be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
2388cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
2389be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &vstabMode, 1);
2390be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2391be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
23928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    uint8_t faceDetectMode = params.enableFaceDetect ?
23932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.fastInfo.bestFaceDetectMode :
23948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            (uint8_t)ANDROID_STATS_FACE_DETECTION_OFF;
2395cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_STATS_FACE_DETECT_MODE,
23968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            &faceDetectMode, 1);
23978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) return res;
23988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2399be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2400be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2401be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2402228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
2403228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
2404228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
2405228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
2406228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2407228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
2408228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
2409228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
2410228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2411228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
2412228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
2413f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
2414228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
2415228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
2416228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2417228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
2418228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2419228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
2420228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
2421228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
2422228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2423228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
2424228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
2425228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
2426228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
2427228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2428228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
24298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
243061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
2431